df[is.na(df)]=0
轻松地对此进行处理,这在应用于单个data.frame时效果很好。
但是,当应用于列表(lapply(l, function(x) x[is.na(x)]=0)
)时,会生成仅包含0 的数据框。
虚拟数据:
df1<-data.frame(class = rep("BO", 3),
a = c(NA,2,3))
df2<-data.frame(class = rep("BS", 3),
a = c(5,NA,7))
l<-list(df1, df2)
# Convert NA to 0
l2<-lapply(l, function(x) x[is.na(x)]=0)
结果:
[[1]]
[1] 0
[[2]]
[1] 0
但我怎么能得到这个呢?
[[1]]
class a
1 BO 0
2 BO 2
3 BO 3
[[2]]
class a
1 BS 5
2 BS 0
3 BS 7
答案 0 :(得分:4)
我们需要返回&#39; x&#39;。这里,我们只返回赋值0.数据集是来自lambda函数调用的x
lapply(l, function(x) {x[is.na(x)] <- 0
x})
这可以使用包装器replace
在一个语句中完成(它在内部执行赋值并返回&#39; x&#39;
lapply(l, function(x) replace(x, is.na(x), 0))
其中replace
是
function (x, list, values) {
x[list] <- values
x
}
除base R
选项外,我们也可以tidyverse
执行此操作
library(tidyverse)
map(l, ~ .x %>%
mutate_all(replace_na, 0))
由于我们只将数字列缺失值替换为0,因此我们可以使用mutate_if
map(l, ~ .x %>%
mutate_if(is.numeric, replace_na, 0))