Verwenden Sie%>% mit Ersatzfunktionen wie colnames () <-

73

Wie kann ich den Pipe Operator verwenden, um in die Ersatzfunktion zu leiten colnames()<-?

Folgendes versuche ich zu tun:

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

Aber im Idealfall wäre es so etwas wie:

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

Gibt es eine Möglichkeit, dies zu tun, ohne jedes Mal eine Spezialfunktion zu schreiben?

Die Antworten hier sind ein Anfang, aber nicht genau meine Frage: Verketten von arithmetischen Operatoren in dplyr

Alex Coppock
quelle
1
Sie könnten Ihre Eingaben so benennen summarise- group_by(mtcars, cyl) %>% summarise(disp_mean=mean(disp), hp_mean=mean(hp))obwohl ich nicht sehe, wie stark die Verwendung colnamesist. Muss jede Kleinigkeit in dplyr erledigt werden?
E-Mail
3
Ich glaube, es gibt eine rename()Funktion in dplyr. Oder ja, mach was @thelatemail gesagt hat.
Rich Scriven
8
Oder verwenden Sie einfach setNameswie ingroup_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% setNames(., c("cyl", "disp_mean", "hp_mean"))
David Arenburg
@DavidArenburg - warum habe ich nicht daran gedacht, da ich gerade vor 2 Minuten darauf hingewiesen habe?
E-Mail
@thelatemail Ich schrieb "names<-"(., ...und dann sagte ich mir "
Moment mal

Antworten:

103

Sie könnten colnames<-oder setNames(dank @David Arenburg) verwenden

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

Oder wählen Sie ein Alias( set_colnames) aus magrittr:

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

dplyr::rename Dies ist möglicherweise praktischer, wenn Sie nur einige von vielen Spalten (neu) benennen (es ist erforderlich, sowohl den alten als auch den neuen Namen zu schreiben; siehe die Antwort von @Richard Scriven).

Henrik
quelle
schön. Ich gehe davon aus, dass die `foo<-`()Syntax für solche "Ersatz" -Funktionen funktioniert.
Alex Coppock
22

Es dplyrgibt verschiedene Möglichkeiten, die Spalten umzubenennen.

Eine ist, die rename()Funktion zu verwenden. In diesem Beispiel müssen Sie die von erstellten Namen zurückkreuzen summarise(), da es sich um Ausdrücke handelt.

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

Sie könnten auch verwenden select(). Dies ist etwas einfacher, da wir die Spaltennummer verwenden können, sodass Sie nicht mehr mit Back-Ticks herumspielen müssen.

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

In diesem Beispiel wäre es jedoch am besten, das zu tun, was @thelatemail in den Kommentaren erwähnt hat, und einen Schritt zurück zu gehen und die Spalten in zu benennen summarise().

group_by(mtcars, cyl) %>%
    summarise(disp_mean = mean(disp), hp_mean = mean(hp))
Rich Scriven
quelle
11

Wir können den zusammengefassten Variablen ein Suffix hinzufügen, indem wir das .funsArgument von summarise_atmit dplyr als folgenden Code verwenden.

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

Wir können Spaltennamen auch auf verschiedene Arten festlegen.

# 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
Keiku
quelle