根据数据框中的位置替换NA值

时间:2014-04-28 10:53:18

标签: r row interpolation na missing-data

我想用之前和之后的行平均值替换NA值。此外,当第一行或最后一行是NA值时,我希望相应地在下一行和行之前重复。我的实际数据有负数和小数值。

我的意见:

1.0   NA    1.0
NA    2.0   2.0
3.0   3.0   NA

我的预期输出:

1.0   2.0   1.0
2.0   2.0   2.0
3.0   3.0   2.0

干杯!

3 个答案:

答案 0 :(得分:4)

您还可以使用na.approx包中的zoo功能。请注意,当您有两个连续的NA值时,它的行为略有不同(比@flodel的解决方案要小)。对于第一行和最后一行,您可以使用na.locf

y <- na.approx(x)
y[nrow(y), ] <- na.locf(y[(nrow(y)-1):nrow(y), ])[2, ] 
y[1, ] <- na.locf(y[1:2,], fromLast=TRUE)[1, ] 
编辑:@Grothendieck指出这太复杂了。您可以将上面的整个代码合并为一行:

na.approx(x, rule=2)

答案 1 :(得分:3)

在将数据转换为矩阵(这也会使计算更快)后,所有矢量化:

x <- matrix(c(2, NA, 3, NA, 2, 3, 1, 2, NA), 3, 3)

p <- rbind(tail(x, -1), NA) # a matrix of previous value
n <- rbind(NA, head(x, -1)) # a matrix of next value
m <- matrix(rowMeans(cbind(as.vector(p),
                           as.vector(n)), na.rm = TRUE), nrow(x)) # replacements

ifelse(is.na(x), m, x)

答案 2 :(得分:0)

很容易解决:

library(imputeTS)
na.interpolation(x)

就这样。