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