我有一个缺少值的表,我正在尝试编写一个替换它的函数 基于最接近的两个非零值进行计算的缺失值。
示例:
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
此功能是否已存在?如果没有,任何建议将不胜感激。
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分:0)
实际上 imputeTS 包(我是维护者)为此提供了一个很好的解决方案。
替换为移动平均线
na.ma(x, k = 2)
x是您的输入对象 k是移动平均窗口
k为1表示您只考虑之前和之后的值 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)
或插值(格罗腾迪克也提到)
imputeTS::na.interpolation(x)
也缺少相同方向的数据替换选项。 如果您有兴趣,可以在R Journal中找到introduction to the imputeTS package。