将NA替换为数据框列表中的最大值

时间:2018-04-10 21:56:10

标签: r lapply na

我有两个数据框和两个问题。在数据帧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))

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

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

>  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错过了您需要将修改后的数据帧作为最后一个对象进行评估的事实。 [<-的结果只是项目,而不是完整的数据框:

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