使用mutate_at将NA值替换为0

8
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方法时跨多个列用0替换NAs?
1个回答

13

我们可以用vars将列名的范围包装起来,并且根据?if_else的文档确保返回值的类型对于if_else(或case_when)是相同的。

与基本的ifelse()函数相比,这个函数更加严格。它检查真和假是否具有相同的类型。这种严格性使输出类型更可预测,并使其有些更快。

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

这里使用了tidyverse的简约选项~,而不是匿名函数调用(function(x))。由于'blah'、'blah2'都是character类型,因此true的返回类型也被引用('0')。


替代if_else的另一个专门用于替换NA的选项是来自tidyrreplace_na

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接