代码之家  ›  专栏  ›  技术社区  ›  maycca

将na替换为“x”[is.na(x)]=0'将替换整个数据帧,而不仅仅是nas?[副本]

na r
  •  1
  • maycca  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有点困惑。我的 列表中的数据帧 包含 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 回复  |  直到 6 年前
        1
  •  4
  •   akrun    6 年前

    我们需要返回“x”。这里,我们只返回作业0。数据集是 x 来自lambda函数调用

    lapply(l, function(x) {x[is.na(x)] <- 0
                           x})
    

    这可以用一个包装器在一个语句中完成。 replace (在内部执行分配并返回“x”

    lapply(l, function(x) replace(x, is.na(x), 0))
    

    哪里 代替

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