我有一个缺少值的数据表,我想用最近的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。
答案 0 :(得分:3)
na.approx
就是这么做的。如果可能存在前导或尾随NA值且您想要:
rule = 2
参数添加到na.approx
或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。