mutate_at将NA替换为0

Dou*_*Fir 5 r dplyr

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)
  })
Run Code Online (Sandbox Code Playgroud)

返回值:

Error in check_dot_cols(.vars, .cols) : object 'blah' not found
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 7

我们可以将列名称的范围包入其中,vars并根据的文档确保(或)的return type相同。if_elsecase_when?if_else

与基础ifelse()相比,此功能更为严格。它检查true和false是同一类型。这种严格性使输出类型更可预测,并且速度更快。

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

在这里,function(x)使用tidyverse concise选项而不是匿名函数调用(),~并且由于'blah','blah2'是character类型,其返回类型true也被引用了('0'


相反的if_else,专门用于替代另一种选择NAreplace_natidyr

library(tidyr)
mtcars1 %>% 
    mutate_at(vars(blah:blah2),  replace_na, '0')
Run Code Online (Sandbox Code Playgroud)