studio mutate meaning example cheatsheet r dataframe dplyr

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