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

4

我希望将缺失值替换为前一个和后一个行的平均值。此外,当第一行或最后一行是缺失值时,我只想重复下一个和前一个行。我的真实数据有负数和小数值。

我的输入:

1.0   NA    1.0
NA    2.0   2.0
3.0   3.0   NA

My expected output:

1.0   2.0   1.0
2.0   2.0   2.0
3.0   3.0   2.0

干杯!

为了澄清,第一列中的 NA 将被替换为其上下两个数值(1.03.0)的平均值或者是其上下两行完整数据的平均值(mean(c(1.0, NA, 1.0, 3.0, 3.0, NA))。 - flodel
是的,它是介于两个立即上下的值之间的平均值,而不是整个列!这是您的问题吗?谢谢您的帮助。 - user3091668
“用前后两个值的平均数替换数值”被称为“插值”。而“重复最后一个非NA值”被称为填充,带有向前/向后传递。 - smci
3个回答

4

您还可以使用zoo软件包中的na.approx函数。请注意,当您有两个连续的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)

无论如何,这将使用NA同列中的信息进行替换,对吧?始终基于上下值... 与连续值有什么区别? - user3091668
根据您的需求,可以使用na.approx(x, rule = 2)na.approx(x, rule = 2, method = "constant") - G. Grothendieck
假设在一列中,您有1、2、NA、NA、5。然后na.approx将给您1、2、3、4、5。@flodel的答案将给您1、2、2、5、5。两者都是合理的答案,只是针对略有不同的问题。 - shadow

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)

0

非常简单解决:

library(imputeTS)
na.interpolation(x)

已经这样了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接