用R中的2个最近行的平均值替换缺失值

时间:2017-12-09 03:44:51

标签: r dataframe datatable

我有一个缺少值的数据表,我想用最近的2行的平均值替换它。

library(data.table)
A <- data.table(id = c(1:10),
                Value = c(1:3,NA,5:10))

> A
    id Value
 1:  1     1
 2:  2     2
 3:  3     3
 4:  4    NA
 5:  5     5
 6:  6     6
 7:  7     7
 8:  8     8
 9:  9     9
10: 10    10

例如,我希望将NA替换为row3和row5的平均值,即4。

2 个答案:

答案 0 :(得分:3)

动物园包中的

na.approx就是这么做的。如果可能存在前导或尾随NA值且您想要:

  • 扩展最近的非NA值,将rule = 2参数添加到na.approx
  • 将那些作为NA添加na.rm = FALSE参数添加到na.approx

有关更多参数,请参阅?na.approx。来自相同包的其他可能性包括na.spline(填充三次样条拟合),na.aggregate(所有非NA值的平均值),na.locf(结转的最后一个值)和{{ 1}}(季节性卡尔曼滤波器)。

na.StructTS

,并提供:

library(zoo)

A[, list(Value = na.approx(Value))]

答案 1 :(得分:1)

我已经创建了一个可以在数据表中使用多个连续NA的函数。

library(data.table)
A <- data.table(id = c(1:11),
            Value = c(1,5:6,NA,10:12,NA,NA,NA,6))



library(dplyr)
# Finding the maximum length of a stretch of contiguous NA's in the column
a<- max(diff(which(!is.na(A$Value)))-1)

# Repeating the for loop "a" times and breaking when all NA's have been filled
repeat{
for(i in 1:a){
A$Value[which(A$Value%in%NA)] <- ((lag(A$Value, 1)+lead(A$Value, i))/2)[which(A$Value%in%NA)]
}
if(any(is.na(A$Value)) ==FALSE) { break }
}

对于向量中的每个NA,for循环内的函数计算NA之前的值和下一个可用值的平均值。

这绝对不是最优雅或最有效的解决方案,因为有很多重复,但我相信它可以按照你想要的方式使用多个NA。