2017-09-26 2 views
2

Ich möchte einen Datenrahmen mit dplyr zusammenzufassen, etwa so:Verwenden Spaltenindex anstelle des Namens in group_by

> test <-data.frame(ID = c("A", "A", "B", "B"), val = c(1:4)) 
> test %>% group_by(ID) %>% summarize(av = mean(val)) 
# A tibble: 2 x 2 
     ID av 
    <fctr> <dbl> 
1  A 1.5 
2  B 3.5 

Aber nehmen wir an, dass anstelle der Gruppierung durch die Spalte „ID“ I durch die erste gruppieren möchten Spalte, unabhängig von ihrem Namen. Gibt es einen einfachen Weg, das zu tun?

ich ein paar naiven Ansätze ausprobiert habe (group_by(1), group_by(.[1]), group_by(., .[1]), group_by(names(.)[1]) ohne Erfolg. Ich bin erst am Anfang nur Pakete verwenden tidyverse so kann ich etwas offensichtlich fehle.

This question ist sehr ähnlich aber es geht um muate und ich konnte es nicht auf mein Problem verallgemeinern. This question ist auch ähnlich, aber die akzeptierte Antwort ist ein anderes Paket zu verwenden, und ich versuche, mit dplyr zu bleiben.

Antwort

5

Sie eine der können scoped Varianten (group_by_at) dafür:

test %>% group_by_at(1) %>% summarise(av = mean(val)) 

# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
3

Sie könnten Verwenden Sie die Standardauswertung mit dplyr::group_by_:

test %>% 
group_by_(names(.)[1]) %>% 
summarize(av = mean(val)) 
## A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
+0

Standardauswertung wird nun [veraltet] (http://dplyr.tidyverse.org/reference/se-deprecated.html). – Lyngbakr

2

Wenn wir brauchen NSE zu verwenden, dann sym und !! kann

test %>% 
    group_by(!! rlang::sym(names(.)[1])) %>% 
    summarise(av = mean(val)) 
# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 

verwendet werden Wir können auch eine Funktion erstellen. Wenn wir zitierte Zeichenfolgen übergeben, dann verwenden wir sym mit !! oder sonst gehen für die enquo/!! Route

f1 <- function(dat, grp, valueCol) { 
    dat %>% 
     group_by(!! rlang::sym(grp)) %>% 
     summarise(av = mean(!! rlang::sym(valueCol))) 
} 

f1(test, "ID", "val") 
# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
+1

Das ist komplizierter, als ich eigentlich für mein Problem brauche, aber es hat mich auf einen fruchtbaren Lernpfad über Evaluation und [Programmierung mit dplyr] (http://dplyr.tidyverse.org/articles/programming.html) gebracht. – Joe

Verwandte Themen