我有一個缺少值的表,我試圖編寫一個函數,它將用基於最接近的兩個非零值的計算代替 缺失值。R丟失值替換函數
實施例:
X Tom
1 4.3
2 5.1
3 NA
4 NA
5 7.4
對於X = 3
,Tom = 5.1 + (7.4-5.1)/2
。
對於X = 4
,Tom = (5.1 + (7.4-5.1)/2) + (7.4-5.1)/2
,這種功能已經存在?如果沒有,任何建議將不勝感激。
我有一個缺少值的表,我試圖編寫一個函數,它將用基於最接近的兩個非零值的計算代替 缺失值。R丟失值替換函數
實施例:
X Tom
1 4.3
2 5.1
3 NA
4 NA
5 7.4
對於X = 3
,Tom = 5.1 + (7.4-5.1)/2
。
對於X = 4
,Tom = (5.1 + (7.4-5.1)/2) + (7.4-5.1)/2
,這種功能已經存在?如果沒有,任何建議將不勝感激。
只要在這種情況下使用循環,其他方法就更難。
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
的更通常的方式來做到這一點(但不等同於問題)是使用線性插值:
library(zoo)
df <- data.frame(X = 1:5, Tom = c(4.3, 5.1, NA, NA, 7.4))
na.approx(df)
或樣條內插:
na.spline(df)
謝謝! na.approx()做了訣竅。你知道算法使用的公式是什麼,或者如何查看它? – user3476463
它使用線性插值。 R'近似'命令在下面做了真正的工作。 '?approx' –
其實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。
我不知道一個函數完全如此。 pkg :: zoo中的'na.locf'函數將「繼續」。 –
我不太明白你在計算X = 4的Tom的價值時的意思,你能否詳細說明一下? – xwang