mutate_at для замены NA на 0 - PullRequest
       0

mutate_at для замены NA на 0

5 голосов
/ 25 октября 2019
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

Как я могу заменить NA на 0 в нескольких столбцах, используя подход dplyr / tidyverse?

1 Ответ

7 голосов
/ 25 октября 2019

Мы можем заключить список имен столбцов в vars, а также убедиться, что возвращаемые значения type одинаковы для if_else (или case_when), основываясь на документации ?if_else

По сравнению с базовым ifelse () эта функция более строгая. Он проверяет, что true и false имеют одинаковый тип. Эта строгость делает выходной тип более предсказуемым и делает его несколько быстрее.

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

Здесь вместо вызова анонимной функции (function(x)) краткий параметр tidyverse с ~ равениспользуются и как 'blah', 'blah2' являются типами character, тип возвращаемого значения для true также указан в кавычках ('0')


Вместо if_else, другой вариант специально длязамена NA - replace_na с tidyr

library(tidyr)
mtcars1 %>% 
    mutate_at(vars(blah:blah2),  replace_na, '0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...