2015-04-29 30 views
2

我有数据,像这样的表:如何向R中的数据框添加缺失的行和插值?

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)等。

这只是一个例子。实际上,我正在处理一个更大的数据集,数量从10增加到5,000,000(有很多缺失的行),所以我需要一些自动化。

感谢您的帮助!

+1

学习使用'dput'呈现的R对象的明确的版本。 –

回答

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 
0

这是一个快速和“脏”的方法来添加行。虽然这不会按顺序插入年龄,但您可以稍后再执行排序,并替换之前缺少的行的值。

下面的代码:

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个值。

这是给你一个关于如何自动化行绑定的想法。

相关问题