【问题标题】:R: Impute missing data with mean of first previous and latter non missing dataR:用前一个和后一个非缺失数据的平均值估算缺失数据
【发布时间】:2015-06-20 04:48:15
【问题描述】:

假设数据如下:

df <- data.frame(ID=1:6, Value=c(NA, 1, NA, NA, 2, NA))
df
  ID Value
1  1    NA
2  2     1
3  3    NA
4  4    NA
5  5     2
6  6    NA

我希望估算的结果是这样的:

  ID Value
1  1   1.0
2  2   1.0
3  3   1.5
4  4   1.5
5  5   2.0
6  6   2.0

更具体地说,我想用前一个和后一个非缺失数据的平均值来估算缺失数据,如果只有一个之前或后一个非缺失数据存在,则用这个非缺失数据进行估算。未定义所有数据缺失的行为。

如何在 R 中做到这一点?

【问题讨论】:

  • 这似乎就是你要找的东西:stackoverflow.com/questions/15308205/…
  • imputeTS::interpolation 和 zoo::approx 可能值得一看,以获得类似于请求的解决方案(确实不是 100% 请求的结果)

标签: r


【解决方案1】:

向前和向后使用na.locf 并取其平均值:

library(zoo)

both <- cbind( na.locf(df$Value, na.rm = FALSE), 
               na.locf(df$Value, na.rm = FALSE, fromLast = TRUE))
transform(df, Value = rowMeans(both, na.rm = TRUE))

给予:

  ID Value
1  1   1.0
2  2   1.0
3  3   1.5
4  4   1.5
5  5   2.0
6  6   2.0

【讨论】:

    【解决方案2】:

    看看approxfunrule=2的设计。这并不完全符合您的要求(因为它对 NA 间隙进行线性插值,而不是替换间隙端点的平均值),但它可能是可以接受的:

    > approxfun(df$ID, df$Value, rule=2)(df$ID)
    [1] 1.000000 1.000000 1.333333 1.666667 2.000000 2.000000
    

    使用rule=2,它在极端情况下的行为确实符合您的要求。 zoo-package 中还有na.approx 方法。

    我会告诫不要将此类数据用于任何进一步的统计推断。这种插补方法本质上是说在没有测量的时期内不可能出现随机变化,而且世界通常不是那么一致的。

    【讨论】:

      【解决方案3】:

      这应该可行。

      for( i in 1:nrow(df)){
          if(is.na(df$Value[i])){
              df$Value[i] <- mean(df$Value[1:i])
          }
      }
      

      我不知道这是否正是你想要的。我没看懂你的说法。 “我想用前一个和后一个非缺失数据的平均值来估算缺失数据,如果只有一个前一个或后一个非缺失数据存在,则用这个非缺失数据进行估算”

      您想找到什么值来替换 NA?

      【讨论】:

        猜你喜欢
        • 2019-08-16
        • 1970-01-01
        • 2021-09-03
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-23
        相关资源
        最近更新 更多