Правильный синтаксис для mutate if

Я хотел бы заменить NA значения с нулями через mutate_if на dplyr. Синтаксис ниже:

set.seed(1)
mtcars[sample(1:dim(mtcars)[1], 5),
       sample(1:dim(mtcars)[2], 5)] <-  NA

require(dplyr)

mtcars %>% 
    mutate_if(is.na,0)

mtcars %>% 
    mutate_if(is.na, funs(. = 0))

возвращает ошибку:

ошибка vapply(tbl, p, logical(1), ...) : значения должны быть длиной 1, но!--5--> результат-длина 32

какой правильный синтаксис для этой операции?

4 ответов


я научился этому трюку у purrr учебник, и он также работает в dplyr. Существует два способа решения этой проблемы:
Во-первых, определите пользовательские функции вне канала и используйте его в mutate_if():

any_column_NA <- function(x){
    any(is.na(x))
}
replace_NA_0 <- function(x){
    if_else(is.na(x),0,x)
}
mtcars %>% mutate_if(any_column_NA,replace_NA_0)

во-вторых, используйте комбинацию ~,. или .x.( .x можно заменить на ., но не любой другой символ или символ):

mtcars %>% mutate_if(~ any(is.na(.x)),~ if_else(is.na(.x),0,.x))
#This also works
mtcars %>% mutate_if(~ any(is.na(.)),~ if_else(is.na(.),0,.))

в вашем случае, вы также можете использовать mutate_all():

mtcars %>% mutate_all(~ if_else(is.na(.x),0,.x))

используя ~, мы можем определить анонимную функцию, пока .x или . обозначает переменную. В mutate_if() случае . или .x каждый столбец.


"Если" в mutate_if относится к выбору колонки, а не строк. Например!--2--> означает выполнение преобразования для всех числовых столбцов в наборе данных.

Если вы хотите заменить все NAs нулями в числовых столбцах:

data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))

mtcars %>% mutate_if(is.numeric, replace_na, 0)

можно использовать set С data.table

library(data.table)
setDT(mtcars)
for(j in seq_along(mtcars)){
  set(mtcars, i= which(is.na(mtcars[[j]])), j = j, value = 0)
 }