Правильный синтаксис для 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)
}