Правильный синтаксис для 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, .)))
можно использовать 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)
}