r - mutate_at 将 NA 替换为 0

标签 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)
  })

返回:

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

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

最佳答案

我们可以将列名的 ranger 包装在 vars 中,并确保返回 typeif_else 相同(或者case_when)基于?if_else

的文档

Compared to the base ifelse(), this function is more strict. It checks that true and false are the same type. This strictness makes the output type more predictable, and makes it somewhat faster.

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

这里,使用带有 ~ 的 tidyverse 简洁选项,而不是匿名函数调用 (function(x)),并且 'blah'、'blah2' 分别是character 类型,true 的返回类型也带引号 ('0')

<小时/>

专门用于替换 NA 的另一个选项是 tidyr 中的 replace_na,而不是 if_else

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

关于r - mutate_at 将 NA 替换为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58563691/

相关文章:

r - 使用 dplyr 查找重复元素

r - 合并(与拆分相反)r 中的行对

r - grid.arrange 的背景

r - 使用 dplyr 切片重复出现的值

r - DPLYR 过滤多个组,每个组都有自己的标准

r - 从 tidyverse 包中消除 ungroup... 消息

r - 在热图上绘制逻辑回归线

javascript - 在不更改标记大小的情况下,使用 plotly proxy 在 plotly 中更改跟踪标记的颜色

r - 对变量进行分组并将它们添加到表的末尾

r - 使用 dplyr 动态创建列