mutate - tidyr r
dplyr cambia muchos tipos de datos (4)
para cambiar los tipos de datos, puedo usar algo como
l1 <- c("fac1","fac2","fac3")
l2 <- c("dbl1","dbl2","dbl3")
dat[,l1] <- lapply(dat[,l1], factor)
dat[,l2] <- lapply(dat[,l2], as.numeric)
con dplyr
dat <- dat %>% mutate(
fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3),
dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3)
)
¿Hay una forma más elegante (más corta) en dplyr?
thx Christof
Como la respuesta de Nick ya está desierta y el comentario de Rafael es realmente útil, quiero agregar esto como una respuesta. Si desea cambiar todas las columnas de factor
a character
use mutate_if
:
dat %>% mutate_if(is.factor, as.character)
También se permiten otras funciones. Por ejemplo, utilicé iconv
para cambiar la codificación de todas las columnas de character
:
dat %>% mutate_if(is.character, function(x){iconv(x, to = "ASCII//TRANSLIT")})
Desde la parte inferior de ?mutate_each
(al menos en dplyr 0.5) parece que esa función, como en la respuesta de @docendo discimus, quedará obsoleta y se reemplazará por alternativas más flexibles mutate_if
, mutate_all
y mutate_at
. El más similar a lo que @hadley menciona en su comentario probablemente esté usando mutate_at
. Tenga en cuenta que el orden de los argumentos se invierte, en comparación con mutate_each
, y vars()
utiliza select()
como semántica, que interpreto que significa las funciones ?select_helpers
.
dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>%
mutate_at(vars(starts_with("dbl")),funs(as.numeric))
Pero mutate_at
puede tomar números de columna en lugar de un argumento vars()
, y después de leer esta página y ver las alternativas, terminé usando mutate_at
pero con grep
para capturar muchos tipos diferentes de nombres de columnas a la vez (a menos que siempre nombres de columna tan obvio!)
dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>%
mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric))
Estaba muy entusiasmado con la idea de mutate_at
+ grep
, porque ahora una línea puede funcionar en muchas columnas.
EDITAR - ahora veo matches()
entre los select_helpers, que maneja expresiones regulares, así que ahora me gusta esto.
dat %>% mutate_at(vars(matches("fac|fctr|fckr")),funs(factor)) %>%
mutate_at(vars(matches("dbl|num|qty")),funs(as.numeric))
Otro comentario generalmente relacionado: si tiene todas sus columnas de fecha con nombres compatibles y formatos consistentes, esto es poderoso. En mi caso, esto convierte todas las columnas de mi AAAAMMDD, que se leyeron como números, en fechas.
mutate_at(vars(matches("_DT$")),funs(as.Date(as.character(.),format="%Y%m%d")))
Puede usar la versión de evaluación estándar de mutate_each
(que es mutate_each_
) para cambiar las clases de columna:
dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2)
Una forma más general de lograr la transformación del tipo de columna es la siguiente:
Si desea transformar todas sus columnas de factores en columnas de caracteres , por ejemplo, esto se puede hacer usando una tubería:
df %>% mutate_each_( funs(as.character(.)), names( .[,sapply(., is.factor)] ))