not r dplyr na

not - r dplyr where



Corregir la sintaxis para mutate_if (4)

Aprendí este truco del tutorial de purrr , y también funciona en dplyr. Hay dos formas de resolver este problema:
Primero, defina las funciones personalizadas fuera de la tubería y mutate_if() en 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)

Segundo, usa la combinación de ~ o .x . ( .x puede reemplazarse con . , pero no con ningún otro caracter o símbolo):

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,.))

En su caso, también puede usar mutate_all() :

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

Usando ~ , podemos definir una función anónima, mientras que .x or . representa la variable. En el caso mutate_if() o .x es cada columna.

Me gustaría reemplazar los valores de NA con ceros a través de mutate_if en dplyr . La sintaxis a continuación:

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))

devuelve error:

Error en vapply(tbl, p, logical(1), ...) : los valores deben ser de longitud 1, pero el resultado FUN(X[[1]]) es de longitud 32

¿Cuál es la sintaxis correcta para esta operación?


El "si" en mutate_if refiere a elegir columnas , no filas. Por ejemplo, mutate_if(data, is.numeric, ...) significa realizar una transformación en todas las columnas numéricas de su conjunto de datos.

Si desea reemplazar todas las AN con ceros en columnas numéricas:

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


Podemos usar el set de 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) }


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