Update
From dplyr
1.0.0我们可以使用across
:
library(dplyr)
df %>% mutate(across(c(vs,am), na_if, 0)) %>% head
# mpg cyl vs am vs_doubled
#1 21.0 6 NA 1 0
#2 21.0 6 NA 1 0
#3 22.8 4 1 1 2
#4 21.4 6 1 NA 2
#5 18.7 8 NA NA 0
#6 18.1 6 1 NA 2
原答案
在之前的版本中dplyr
我们可以用mutate_at
:
df %>% mutate_at(vars(vs,am), ~na_if(.,0)) %>% head
或者另一种方式是
df %>% mutate_at(vars(vs,am), na_if, 0)
~
是 purrr 风格的公式语法,而.
代表列的值。它是匿名函数调用的替代方案,您可以将上述函数编写为
df %>% mutate_at(vars(vs,am), function(x) na_if(x, 0))
另外所示的替代方式不需要~
我们可以直接传递带有附加参数的函数(这里为 0y
).
当然,还有其他方法可以在不使用的情况下做到这一点na_if
df %>% mutate_at(vars(vs, am), ~replace(., . == 0, NA))
或与基础 R 相同
cols <- c("vs", "am")
df[cols] <- lapply(df[cols], function(x) replace(x, x == 0, NA))