R缺失值替换功能

时间:2014-03-29 20:12:41

标签: r missing-data imputation

我有一个缺少值的表,我正在尝试编写一个替换它的函数 基于最接近的两个非零值进行计算的缺失值。

示例:

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

此功能是否已存在?如果没有,任何建议将不胜感激。

3 个答案:

答案 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