【问题标题】:Replace NA by max value in column in a list of data frames将 NA 替换为数据框列表中列中的最大值
【发布时间】:2018-04-10 21:56:10
【问题描述】:

我有两个数据框和两个问题。在数据帧 df1 和 df2 中,我可以将 NA 替换为 0。

df1

 var1 <- c(1, NA, 2, NA, 4, 5, 5)
 var2 <- c(1, 2, 3, 4, 5, 6, 7)
 df1 <- data.frame(var1, var2)
 df1$var1[is.na(df1$var1)] <- 0

df2

 var1 <- c(1, NA, 2, NA, 4, 5, 9)
 var2 <- c(1, 2, 3, 4, 5, 6, 7)
 df2 <- data.frame(var1, var2)
 df2$var1[is.na(df1$var1)] <- 0

但是,如果我想用 var1 的最大值而不是 0 替换 NA,这将如何工作?我以为会是以下,但它不起作用。

 df1$var1[is.na(df1$var1)] <- max(df1$var1)

一旦解决了这个问题,我实际上想使用 lapply 对数据框列表执行此操作。

 mylist <- list(df1, df2)

我的想法类似于以下内容 - 这也不起作用。

lapply(mylist, function(x) x$var1[is.na(x$var1)] <- max(x$var1))

非常感谢您的帮助!

【问题讨论】:

    标签: r lapply na


    【解决方案1】:

    需要在max中使用na.rm=TRUE

    >  df1$var1[is.na(df1$var1)] <- max(df1$var1, na.rm=TRUE)
    > 
    > 
    >  var1 <- c(1, NA, 2, NA, 4, 5, 9)
    >  var2 <- c(1, 2, 3, 4, 5, 6, 7)
    >  df2 <- data.frame(var1, var2)
    >  df2$var1[is.na(df1$var1)] <-  max(df2$var1, na.rm=TRUE)
    > df1
      var1 var2
    1    1    1
    2    5    2
    3    2    3
    4    5    4
    5    4    5
    6    5    6
    7    5    7
    > df2
      var1 var2
    1    1    1
    2   NA    2
    3    2    3
    4   NA    4
    5    4    5
    6    5    6
    7    9    7
    

    您尝试使用lapply 错过了您需要将修改后的数据框作为最后一个评估对象的事实。 [&lt;- 的结果只是项目而不是完整的数据框:

    lapply(mylist, function(x) {x$var1[is.na(x$var1)] <- max(x$var1, na.rm=TRUE); x})
    

    【讨论】:

    • 这行得通,谢谢@42- 更正代码和lapply 上的解释。我在df2 的问题中有一个错字。应该是df2$var1[is.na(df2$var1)] &lt;- 0。因此,df2$var1[is.na(df2$var1)] &lt;- max(df2$var1, na.rm=TRUE).
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2019-04-03
    • 1970-01-01
    • 2018-09-07
    • 2018-02-11
    相关资源
    最近更新 更多