2014-03-29 59 views
1

我有一個缺少值的表,我試圖編寫一個函數,它將用基於最接近的兩個非零值的計算代替 缺失值。R丟失值替換函數

實施例:

X Tom  
1 4.3  
2 5.1  
3 NA  
4 NA  
5 7.4 

對於X = 3Tom = 5.1 + (7.4-5.1)/2

對於X = 4Tom = (5.1 + (7.4-5.1)/2) + (7.4-5.1)/2

,這種功能已經存在?如果沒有,任何建議將不勝感激。

+0

我不知道一個函數完全如此。 pkg :: zoo中的'na.locf'函數將「繼續」。 –

+0

我不太明白你在計算X = 4的Tom的價值時的意思,你能否詳細說明一下? – xwang

回答

0

只要在這種情況下使用循環,其他方法就更難。

for (i in seq_len(nrow(df)) { 
    if (is.na(df[i, 'Tom'])) 
    df[i, 'Tom'] <- ((tmp <- c(0, df$Tom[!is.na(df$Tom)], 0))[i+1] + tmp[i])/2 + tmp[i] 
} 

df <- data.frame(X = seq_len(100), Tom = ifelse(runif(100, 0, 1) > 0.5, NA, round(runif(100, 0, 10), 1))) 
head(df) 
# X Tom 
# 1 1 NA 
# 2 1.4 
# 3 3 NA 
# 4 4 3.9 
# 5 5 NA 
for (i in seq_len(nrow(df))) { if (is.na(df[i, 'Tom'])) df[i, 'Tom'] <- ((tmp <- c(0, df$Tom[!is.na(df$Tom)], 0))[i+1] + tmp[i])/2 + tmp[i] } 
head(df) 
# X Tom 
# 1 1 0.70 
# 2 2 1.40 
# 3 3 4.05 
# 4 4 3.90 
# 5 5 9.05 
1

的更通常的方式來做到這一點(但不等同於問題)是使用線性插值:

library(zoo) 
df <- data.frame(X = 1:5, Tom = c(4.3, 5.1, NA, NA, 7.4)) 

na.approx(df) 

或樣條內插:

na.spline(df) 
+0

謝謝! na.approx()做了訣竅。你知道算法使用的公式是什麼,或者如何查看它? – user3476463

+0

它使用線性插值。 R'近似'命令在下面做了真正的工作。 '?approx' –

0

其實imputeTS包(我是維護者)爲此提供了很好的解決方案。

置換移動平均

na.ma(x, k = 2) 

x是你的輸入對象 k的移動平均窗

的1 k表示你之前和之後的K 2 只考慮值意味着您考慮之前的2個值和之後的2個值

此功能可能最接近所需的計算。 唯一的區別是,imputeTS方法不會跳過NA值。 (根據線程啓動器的要求)

但特別是對於較長的NA條紋,這是非常有意義的。 1,2,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,14,15,16, (對於位置3處的NA取2和14的平均值將是無好主意)

此外最後觀察向前(如在評論中提及42)

imputeTS::na.locf(x) 

插值(如也是由G.格羅騰迪克提到)

imputeTS::na.interpolation(x) 

也缺少相同方向的數據替換選項。 如果您有興趣,這裏是R Journal的introduction to the imputeTS package