Правильный синтаксис для 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, но FUN(X[[1]])
- это длина 32
Какой правильный синтаксис для этой операции?
Ответы
Ответ 1
Я узнал этот трюк из учебника 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
- каждый столбец.
Ответ 2
"If" в mutate_if
относится к выбору столбцов, а не строк. Например, mutate_if(data, is.numeric,...)
означает выполнение преобразования во всех числовых столбцах в вашем наборе данных.
Если вы хотите заменить все НС нулями в числовых столбцах:
data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))
Ответ 3
mtcars %>% mutate_if(is.numeric, replace_na, 0)
Ответ 4
Мы можем использовать 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)
}