我的数据框缺少值:
X Y Z
54 57 57
100 58 58
NA NA NA
NA NA NA
NA NA NA
60 62 56
NA NA NA
NA NA NA
69 62 62
我想从已知值线性地估算NA值,以便数据框看起来:
X Y Z
54 57 57
100 58 58
90 59 57.5
80 60 57
70 61 56.5
60 62 56
63 62 58
66 62 60
69 60 62
感谢
答案 0 :(得分:7)
Base R' s approxfun()
返回一个函数,该函数将线性插入它所传递的数据。
## Make easily reproducible data
df <- read.table(text="X Y Z
54 57 57
100 58 58
NA NA NA
NA NA NA
NA NA NA
60 62 56
NA NA NA
NA NA NA
69 62 62", header=T)
## See how this works on a single vector
approxfun(1:9, df$X)(1:9)
# [1] 54 100 90 80 70 60 63 66 69
## Apply interpolation to each of the data.frame's columns
data.frame(lapply(df, function(X) approxfun(seq_along(X), X)(seq_along(X))))
# X Y Z
# 1 54 57 57.0
# 2 100 58 58.0
# 3 90 59 57.5
# 4 80 60 57.0
# 5 70 61 56.5
# 6 60 62 56.0
# 7 63 62 58.0
# 8 66 62 60.0
# 9 69 62 62.0
答案 1 :(得分:3)
我可以推荐我正在维护的imputeTS包(即使是时间序列插补)
对于这种情况,它会像这样工作:
library(imputeTS)
df$X <- na.interpolation(df$X, option ="linear")
df$Y <- na.interpolation(df$Y, option ="linear")
df$Z <- na.interpolation(df$Z, option ="linear")
如上所述,包需要时间序列/矢量输入。 (这就是为什么必须单独调用每一列的原因)
该软件包还提供了许多其他插补功能,例如:样条插值。