r dplyr magrittr

use%>% con funciones de reemplazo como colnames()<-



dplyr magrittr (3)

¿Cómo puedo usar el operador de tubería para colnames()<- función de reemplazo como colnames()<- ?

Esto es lo que trato de hacer:

library(dplyr) averages_df <- group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) colnames(averages_df) <- c("cyl", "disp_mean", "hp_mean") averages_df # Source: local data frame [3 x 3] # # cyl disp_mean hp_mean # 1 4 105.1364 82.63636 # 2 6 183.3143 122.28571 # 3 8 353.1000 209.21429

Pero idealmente sería algo así como:

averages_df <- group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% add_colnames(c("cyl", "disp_mean", "hp_mean"))

¿Hay alguna forma de hacerlo sin escribir una función especial cada vez?

Las respuestas aquí son un comienzo, pero no es exactamente mi pregunta: Encadenar operadores aritméticos en dplyr


En dplyr , hay un par de formas diferentes de cambiar el nombre de las columnas.

Una es usar la función rename() . En este ejemplo, debe hacer una copia de seguridad de los nombres creados por summarise() , ya que son expresiones.

group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% rename(disp_mean = `mean(disp)`, hp_mean = `mean(hp)`) # cyl disp_mean hp_mean # 1 4 105.1364 82.63636 # 2 6 183.3143 122.28571 # 3 8 353.1000 209.21429

También puedes usar select() . Esto es un poco más fácil porque podemos usar el número de columna, eliminando la necesidad de perder el tiempo con los tics de retroceso.

group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% select(1, disp_mean = 2, hp_mean = 3)

Pero para este ejemplo, la mejor manera sería hacer lo que @thelatemail mencionó en los comentarios, y eso es retroceder un paso y nombrar las columnas en summarise() .

group_by(mtcars, cyl) %>% summarise(disp_mean = mean(disp), hp_mean = mean(hp))


Podemos agregar un sufijo a las variables resumidas usando el argumento summarise_at de summarise_at con dplyr como el código siguiente.

library(dplyr) # summarise_at with dplyr mtcars %>% group_by(cyl) %>% summarise_at( .cols = c("disp", "hp"), .funs = c(mean="mean") ) # A tibble: 3 × 3 # cyl disp_mean hp_mean # <dbl> <dbl> <dbl> # 1 4 105.1364 82.63636 # 2 6 183.3143 122.28571 # 3 8 353.1000 209.21429

Además, podemos establecer nombres de columna de varias maneras.

# set_names with magrittr mtcars %>% group_by(cyl) %>% summarise(mean(disp), mean(hp)) %>% magrittr::set_names(c("cyl", "disp_mean", "hp_mean")) # set_names with purrr mtcars %>% group_by(cyl) %>% summarise(mean(disp), mean(hp)) %>% purrr::set_names(c("cyl", "disp_mean", "hp_mean")) # setNames with stats mtcars %>% group_by(cyl) %>% summarise(mean(disp), mean(hp)) %>% stats::setNames(c("cyl", "disp_mean", "hp_mean")) # A tibble: 3 × 3 # cyl disp_mean hp_mean # <dbl> <dbl> <dbl> # 1 4 105.1364 82.63636 # 2 6 183.3143 122.28571 # 3 8 353.1000 209.21429


Puede usar colnames<- o setNames (gracias a @David Arenburg)

group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% `colnames<-`(c("cyl", "disp_mean", "hp_mean")) # or # `names<-`(c("cyl", "disp_mean", "hp_mean")) # setNames(., c("cyl", "disp_mean", "hp_mean")) # cyl disp_mean hp_mean # 1 4 105.1364 82.63636 # 2 6 183.3143 122.28571 # 3 8 353.1000 209.21429

O elige un Alias ( set_colnames ) de magrittr :

library(magrittr) group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% set_colnames(c("cyl", "disp_mean", "hp_mean"))

dplyr::rename puede ser más conveniente si solo (re) nombra algunas de las muchas columnas (requiere escribir tanto el nombre antiguo como el nuevo; vea la respuesta de @Richard Scriven)