【问题标题】:Replace NA with average of the case before and after the NA将 NA 替换为 NA 前后案例的平均值
【发布时间】:2017-10-12 15:01:17
【问题描述】:

假设我有以下data.frame:

t<-c(1,1,2,4,5,4)
u<-c(1,3,4,5,4,2)
v<-c(2,3,4,5,NA,2)
w<-c(NA,3,4,5,2,3)
x<-c(2,3,4,5,6,NA)

df<-data.frame(t,u,v,w,x)

我想用代表 NA 前后案例平均值的值替换 NA,除非行以 NA 开始(第 4 行)或结束(第 5 行)。当行以 NA 开头时,我想用以下情况替换 NA。当行以 NA 结尾时,我想用前一种情况替换 NA。

因此,我希望我的输出看起来像:

t<-c(1,1,2,4,5,4)
u<-c(1,3,4,5,4,2)
v<-c(2,3,4,5,3.5,2)
w<-c(3,3,4,5,2,3)
x<-c(2,3,4,5,6,6)

df<-data.frame(t,u,v,w,x)

【问题讨论】:

  • 不要将您的输出放在评论中,而是编辑您的问题。
  • 尝试从zoo查看?na.aggregate
  • 后面的case和前面的case是什么意思?
  • 选择数据并按下 control k。这会将它缩进 4 个空格,在这种情况下 SO 会正确格式化它。
  • 感谢您的思考! @Mike:我指的是同一行中 NA 之前和 NA 之后的值。因此,我还没有找到正确的选项。很抱歉不清楚。 @G:感谢您的帮助!

标签: r replace average na


【解决方案1】:

问题是指第 4 行以 NA 开头,第 5 行以 NA 结尾,但实际上输入 df 的第 4 列以 NA 开头,输入的第 5 列以 NA 结尾,第 4 行和第 5 行都不是输入以 NA 开头或结尾,因此我们将假设该列是指,而不是行。问题中还有两个数据框都命名为df。显然,一个应该代表输入,另一个具有相同名称的数据框是输出,但为了清楚起见,我们重复了我们在末尾注释中使用的 df 的定义。

na.approx 在动物园里几乎就是这样做的。 (如果矩阵结果正常,则省略data.frame() 部分。)

library(zoo)

data.frame(na.approx(df, rule = 2))

给予:

  t u   v w x
1 1 1 2.0 3 2
2 1 3 3.0 3 3
3 2 4 4.0 4 4
4 4 5 5.0 5 5
5 5 4 3.5 2 6
6 4 2 2.0 3 6

注意:为清楚起见,我们使用此数据框作为上面的输入:

df <- structure(list(t = c(1, 1, 2, 4, 5, 4), u = c(1, 3, 4, 5, 4, 
2), v = c(2, 3, 4, 5, NA, 2), w = c(NA, 3, 4, 5, 2, 3), x = c(2, 
3, 4, 5, 6, NA)), .Names = c("t", "u", "v", "w", "x"), row.names = c(NA, 
-6L), class = "data.frame")

【讨论】:

    【解决方案2】:
    sapply(df, function(x){
        replace(x, is.na(x), rowMeans(cbind(c(NA, head(x, -1)), c(x[-1], NA)), na.rm = TRUE)[is.na(x)])
    })
    #     t u   v w x
    #[1,] 1 1 2.0 3 2
    #[2,] 1 3 3.0 3 3
    #[3,] 2 4 4.0 4 4
    #[4,] 4 5 5.0 5 5
    #[5,] 5 4 3.5 2 6
    #[6,] 4 2 2.0 3 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多