web-dev-qa-db-fra.com

utilisez%>% avec des fonctions de remplacement comme les noms de colonnes () <-

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

48
Alex Coppock

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)

68
Henrik

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))
19
Rich Scriven

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
8
Keiku