Мы можем сделать
library(dplyr)
df %>% mutate_at(vars(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
Или другой способ будет
df %>% mutate_at(vars(vs,am), na_if, 0)
~
- это синтаксис формулы в стиле мурлыканья, тогда как .
представляет значение столбца.Это альтернатива анонимным вызовам функций, с помощью которых вы бы написали вышеупомянутую функцию как
df %>% mutate_at(vars(vs,am), function(x) na_if(x, 0))
Также показанный альтернативный способ не требует ~
, и мы можем напрямую передать функцию с дополнительными аргументами (что является0 здесь для y
).
И, конечно, есть другие способы сделать это без использования 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))