【问题标题】:Substitute NA values depending of position in dataframe根据数据框中的位置替换 NA 值
【发布时间】:2014-04-28 10:53:17
【问题描述】:

我想用前一行和后一行的平均值替换 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

干杯!

【问题讨论】:

  • 澄清一下,第 1 列中的 NA 被上面和下面的两个值的平均值(1.03.0)或上面两个完整行的平均值替换下面(mean(c(1.0, NA, 1.0, 3.0, 3.0, NA))?
  • 是的,是上下两个值之间的平均值,而不是整个列!是你的问题吗?谢谢你的帮助。
  • '用前一个和下一个的平均值代替值'称为插值。而 'repeat last non-NA' 称为填充,带有进位/后退

标签: r row interpolation na missing-data


【解决方案1】:

您还可以使用 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同一列中的信息来替换它,对吗?始终基于高于和低于值...与连续值有什么区别?
  • 或者只是:na.approx(x, rule = 2)na.approx(x, rule = 2, method = "constant"),这取决于你想要什么。
  • 假设在一列中,你有 1、2、NA、NA、5。那么na.approx 会给你 1、2、3、4、5。@flodel 的答案会给你 1, 2、2、5、5。两者似乎都是合理的答案,只是问题略有不同。
【解决方案2】:

将数据转换为矩阵后全部矢量化(这也将使计算更快):

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)

【讨论】:

    【解决方案3】:

    很容易解决:

    library(imputeTS)
    na.interpolation(x)
    

    已经这样了。

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多