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?
我们可以将列名称的范围包入其中,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,专门用于替代另一种选择NA是replace_na从tidyr
library(tidyr)
mtcars1 %>%
mutate_at(vars(blah:blah2), replace_na, '0')
Run Code Online (Sandbox Code Playgroud)