如何在R中的数据帧中添加缺失行和插值?

时间:2015-04-29 00:12:05

标签: r interpolation

我有一个这样的数据表:

dat <- data.frame(
   age  = c(0,10,20,40,70,100),
   surv = c(1.0,0.9,0.8,0.6,0.3,0.0)
)

我想为每个缺少的年龄(30,50,60,80,90)添加一行,然后我想将幸存的线性插值添加到新行。所以新行将是(30,0.7)(80,0.2)等。

这只是一个例子。我实际上使用的是一个更大的数据集,从0到5,000,000到10(有大量缺失的行),所以我需要一些自动化。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

制作主数据集,然后使用approx进行线性插值:

newdat <- merge(data.frame(age=seq(0,100,10)),dat,all=TRUE)
newdat$surv[is.na(newdat$surv)] <- 
    with(newdat, approx(age, surv, xout=age)$y)[is.na(newdat$surv)]

newdat

#   age surv
#1    0  1.0
#2   10  0.9
#3   20  0.8
#4   30  0.7
#5   40  0.6
#6   50  0.5
#7   60  0.4
#8   70  0.3
#9   80  0.2
#10  90  0.1
#11 100  0.0

答案 1 :(得分:0)

这是一个快速的&#34;脏&#34;添加行的方法。虽然这不按顺序插入年龄,但您可以稍后进行排序并替换先前缺失的行的值。

以下代码:

 df <- data.frame(age=c(0,10,20,40,70,100), surv=c(1.0,0.9,0.8,0.6,0.3,0.0))
 addrow <- c(30,50,60,80,90)

 df_save <- df
 i = 1

 for (r in c(1:nrow(df) ))  {

     if (addrow[i] %in% df[,1] ) {
        print(paste("TRUE", , sep=":"))
     } else {
       if (i <= length(addrow) ) {
          newrow <- c(addrow[i], 999)
          df <- rbind(df[1:r,], newrow, df[(r+1):nrow(df),])
       }
     }
     i = i+1
 }

df[order[df$age],)

然后将999值替换为相应年龄的幸存值。

这是为了让您了解如何自动化行绑定。