Совместное использование mutate_at и na_if для замены нулей на NA только для некоторых столбцов - PullRequest
3 голосов
/ 08 июля 2019

Мои данные принимают этот формат:

library(tidyverse)
df <- mtcars
df <- df %>% mutate(vs_doubled = vs * 2) %>% select(mpg, cyl, vs, am, vs_doubled)

head(df)


#>    mpg cyl vs am vs_doubled
#> 1 21.0   6  0  1          0
#> 2 21.0   6  0  1          0
#> 3 22.8   4  1  1          2
#> 4 21.4   6  1  0          2
#> 5 18.7   8  0  0          0
#> 6 18.1   6  1  0          2

Я пытаюсь использовать mutate_at и na_if, чтобы установить 0 значений как NA - но только для определенных столбцов ("vs" и "am"). Я хотел бы оставить столбец "vs_doubled" с нулями в нем.

Я не совсем понял, потому что следующая строка не работает:

df <- df %>% mutate_at(.vars = c("vs", "am"), .funs = na_if(y = 0))

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Мы можем сделать

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))
1 голос
/ 08 июля 2019

Мы можем использовать case_when с mutate_at

library(tidyverse)
df %>% 
     mutate_at(vars(vs, am), ~ case_when(!. ~ NA_real_, TRUE ~ .)) %>%
     head
...