2017-08-14 74 views
1

当我有一些缺失值数据集的顺序:插入NA行丢失数据

Seq<-c(1,2,3,4,6,7,10,11,12,18,19,20) 
Data<-c(3,4,5,4,3,2,1,2,3,5,4,3) 
DF<-data.frame(Seq, Data) 

我想行添加到这组数据接近,我已经缺失值和填充数据与NA。因此,无论何时,如果间隙大于2,我都会添加一个NA行(如果间隙很大,则会添加多行)。其结果将是这个样子:

NewSeq<-c(1,2,3,4,6,7,8.5,10,11,12,14,16,18,19,20) 
NewData<-c(3,4,5,4,3,2,NA,1,2,3,NA,NA,18,19,20) 
NewDF<-data.frame(NewSeq,NewData) 

所以我不理当差距只有2 <,但我添加NA行随时存在一定的差距> 2.如果仍然加入后> 2的差距一个NA行,我补充另一个,直到差距填补。

+0

如何确定添加'NA'行时'Seq'中的数字? – www

+1

你的问题是什么?你不希望有人为你编程,对吗?你自己编写这个程序有什么问题? – Yunnosch

回答

1

不是很优雅,但是这是我会怎么做:

Seq<-c(1,2,3,4,6,7,10,11,12,18,19,20) 
Data<-c(3,4,5,4,3,2,1,2,3,5,4,3) 
DF<-data.frame(Seq, Data) 

first <- DF$Seq 
second <- DF$Data 

for(i in length(first):2) { 
    gap <- first[i] - first[i - 1] 
    if(gap > 2) { 
    steps <- ifelse(gap %% 2 == 1, gap %/% 2, (gap %/% 2) -1) 
    new_values_gap <- gap/(steps + 1) 
    new_values <- vector('numeric') 
    for(j in 1:steps) { 
     new_values <- c(new_values, first[i - 1] + j * new_values_gap) 
    } 
    first <- c(first[1:i - 1], new_values, first[i:length(first)]) 
    second <- c(second[1:i - 1], rep(NA, length(new_values)), second[i:length(second)]) 
    } 
} 

NewDF <- data.frame(NewSeq = first, NewData = second) 

> NewDF 

## NewSeq NewData 
## 1  1.0  3 
## 2  2.0  4 
## 3  3.0  5 
## 4  4.0  4 
## 5  6.0  3 
## 6  7.0  2 
## 7  8.5  NA 
## 8 10.0  1 
## 9 11.0  2 
## 10 12.0  3 
## 11 14.0  NA 
## 12 16.0  NA 
## 13 18.0  5 
## 14 19.0  4 
## 15 20.0  3 
1

好像作品的例子,但不知道它怎么会在我还没有看到数据执行。您需要调整ifelse声明中的时间间隔,具体取决于您希望如何考虑不同的时间间隔。

Seq<-c(1,2,3,4,6,7,10,11,12,18,19,20) 
Data<-c(3,4,5,4,3,2,1,2,3,5,4,3) 
DF<-data.frame(Seq, Data) 


diffs <- diff(Seq) 
inds <- which(diffs > 2) 
new.vals <- sapply(inds, function(x) 
    if(diffs[x] %% 2 != 0){ 
    seq(Seq[x]+1.5, Seq[x+1]-1.5,1.5) 
    }else{ 
     seq(Seq[x]+2, Seq[x+1]-2,2) 
    }) 

add.length <- unlist(lapply(new.vals, function(x) length(x))) 
Seq.new <- c(Seq, unlist(new.vals)) 
id <- c(seq_along(Seq), 
rep(inds+0.5,add.length)) 
Seq.new <- Seq.new[order(id)] 
Data.new <- c(Data, rep(NA, sum(add.length))) 
id <- c(seq_along(Seq), 
     rep(inds+0.5,add.length)) 
Data.new <- Data.new[order(id)] 
NewDF <- data.frame(Seq.new, Data.new)