我有一个这样的数据表:
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(有大量缺失的行),所以我需要一些自动化。
感谢您的帮助!
答案 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值替换为相应年龄的幸存值。
这是为了让您了解如何自动化行绑定。