将NA替换为0乘以' x [is.na(x)] = 0'取代整个数据框架,而不仅仅是NA?

时间:2018-05-22 19:04:02

标签: r na

我有点困惑。我的列表中的数据框 包含 NA值,我希望替换为0 。 在单个数据框架上,我可以通过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

1 个答案:

答案 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))