用数据框列表中列中的最大值替换 NA
Replace NA by max value in column in a list of data frames
我有两个数据框和两个问题。在数据帧 df1 和 df2 中,我可以用 0 替换 NA。
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))
非常感谢您的帮助!
需要在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
的尝试忽略了一个事实,即您需要将修改后的数据框作为最后一个评估的对象。 [<-
的结果只是项目而不是完整的数据框:
lapply(mylist, function(x) {x$var1[is.na(x$var1)] <- max(x$var1, na.rm=TRUE); x})
我有两个数据框和两个问题。在数据帧 df1 和 df2 中,我可以用 0 替换 NA。
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))
非常感谢您的帮助!
需要在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
的尝试忽略了一个事实,即您需要将修改后的数据框作为最后一个评估的对象。 [<-
的结果只是项目而不是完整的数据框:
lapply(mylist, function(x) {x$var1[is.na(x$var1)] <- max(x$var1, na.rm=TRUE); x})