【问题标题】:mutate_at to replace NAs with 0mutate_at 用 0 替换 NA
【发布时间】:2020-02-22 02:40:32
【问题描述】:
mtcars1 <- mtcars %>% 
  mutate(blah = LETTERS[seq(1,26, length.out = nrow(.))],
         blah2 = letters[seq(1,26, length.out = nrow(.))])

# sprinkle some random NA values
mtcars1$blah[c(1,3,5,10,11)] <- NA
mtcars1$blah2[c(1,2,5,15,20)] <- NA


mtcars1 %>% 
  mutate_at(blah:blah2, function(x) {
    if_else(is.na(x), 0, x)
  })

返回:

Error in check_dot_cols(.vars, .cols) : object 'blah' not found

如何使用 dplyr/tidyverse 方法在多个列中将 NA 替换为 0?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以将列名的 ranger 包装在 vars 中,并根据 ?if_else 的文档确保 if_else(或 case_when)的返回 types 相同

    与基础 ifelse() 相比,这个函数更加严格。它检查 true 和 false 是否为同一类型。这种严格性使输出类型更可预测,并使其速度更快。

    library(dplyr)
    mtcars1 %>% 
        mutate_at(vars(blah:blah2),  ~ if_else(is.na(.), '0', .))
    

    这里,不是匿名函数调用(function(x)),而是使用带有~的tidyverse简洁选项,因为'blah','blah2'是character类型,true的返回类型是还引用了 ('0')


    代替if_else,另一个专门用于替换NA 的选项是replace_na from tidyr

    library(tidyr)
    mtcars1 %>% 
        mutate_at(vars(blah:blah2),  replace_na, '0')
    

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2019-11-17
      • 2014-11-30
      • 2012-06-17
      • 2021-07-02
      相关资源
      最近更新 更多