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)