2015-04-29 50 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個值。

這是給你一個關於如何自動化行綁定的想法。

相關問題