Comment puis-je utiliser l'opérateur de tuyau pour diriger vers une fonction de remplacement comme colnames()<-
?
Voici ce que j'essaie de faire:
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
Mais idéalement, ce serait quelque chose comme:
averages_df <-
group_by(mtcars, cyl) %>%
summarise(mean(disp), mean(hp)) %>%
add_colnames(c("cyl", "disp_mean", "hp_mean"))
Existe-t-il un moyen de le faire sans écrire à chaque fois une fonction spécialisée?
Les réponses ici sont un début, mais pas exactement ma question: Chaînage des opérateurs arithmétiques dans dplyr
Vous pouvez utiliser colnames<-
ou setNames
(merci à @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
Ou choisissez 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
peut être plus pratique si vous ne (re) nommez que quelques-unes des nombreuses colonnes (cela nécessite d'écrire à la fois l'ancien et le nouveau nom; voir la réponse de @Richard Scriven)
Dans dplyr
, il existe plusieurs façons de renommer les colonnes.
L'une consiste à utiliser la fonction rename()
. Dans cet exemple, vous devez cocher les noms créés par summarise()
, car ce sont des expressions.
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
Vous pouvez également utiliser select()
. C'est un peu plus facile car nous pouvons utiliser le numéro de colonne, ce qui élimine la nécessité de jouer avec les tiques inverses.
group_by(mtcars, cyl) %>%
summarise(mean(disp), mean(hp)) %>%
select(1, disp_mean = 2, hp_mean = 3)
Mais pour cet exemple, la meilleure façon serait de faire ce que @thelatemail a mentionné dans les commentaires, et c'est de revenir en arrière d'une étape et de nommer les colonnes dans summarise()
.
group_by(mtcars, cyl) %>%
summarise(disp_mean = mean(disp), hp_mean = mean(hp))
Nous pouvons ajouter un suffixe aux variables résumées en utilisant .funs
argument de summarise_at
avec dplyr comme code ci-dessous.
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
De plus, nous pouvons définir des noms de colonne de plusieurs manières.
# 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