用最后10个非NA obs中的值样本替换特定列中的每个NA

时间:2015-03-14 02:07:19

标签: r data.table

有没有办法绕过for/loop替换NAdata.table的特定列中的每个(缺失值)R,并使用从中取样的值该专栏前面的最后一次10 non-NA观察结果? 我试图这样做而不需要for loop

请 - 向上

你是对的(Akrun)但是因为这是一次性的事情,我可以手动做这些..这是一个例子

Date    Temp
1/26/2013   41
1/27/2013   40
1/28/2013   48
1/29/2013   25
1/30/2013   21
1/31/2013   28
1/1/2013    38
1/2/2013    36
1/3/2013    31
1/4/2013    32
1/5/2013    39
1/6/2013    38
1/7/2013    40
1/8/2013    NA
1/9/2013    NA
1/10/2013   NA
1/11/2013   NA
1/12/2013   NA
1/13/2013   31
1/14/2013   30
1/15/2013   31
1/16/2013   38
1/17/2013   45
1/18/2013   46
1/19/2013   51
1/20/2013   47

我想通过从以前的temps历史中抽样来替换NA值。我最终写了一个for循环工作正常...但是搜索更加计算效率的代码 以下是我的功能

i<-c()
a.obs<-c()
x<-c()
Fun_missingtemp <- function(x){
   for(i in 1:length(x$Tavg)){
     while (is.na(x$Tavg[i])){
     a.obs<-x$Tavg[(i-11):i-1]
     x[i, Tavg:=sample(a.obs, 1, replace=TRUE)]
     }  
   }
 x
}

1 个答案:

答案 0 :(得分:0)

base R解决方案

indx <- which(is.na(df1$Val))
df1$Val[indx] <- vapply(indx, function(i) {
           x <- tail(na.omit(df1$Val[1:i]),10)
           if(length(x)>0) sample(x,1) else NA}, 0)

数据

set.seed(95)
df1 <- data.frame(Col=LETTERS[1:20],Val=sample(c(NA, 1:5), 20, 
      replace=TRUE), stringsAsFactors=FALSE)