2016-11-29 3 views
3

I, innerhalb eines group_by Anruf, dplyr der Spaltenwähler wie starts_with(), ends_with(), matches(), ..., oder auch die Syntax -colName verwenden möchten.komplexe Spaltenauswahl in dplyr group_by

(Dumme) Beispiel für die Syntax ich nach bin:

library("dplyr") 

# I would like to do something like this 
mtcars %>% 
    group_by(matches("a")) %>% 
    summarise(mpg=mean(mpg)) 
# but I get a "wrong result size" error 

ich hatte gehofft, funktionieren würde, analog zu:

mtcars %>% select(matches("a")) 

die hier würde wählen Spalten drat, am, gear, carb

Um kristallklar zu sein: Ich möchte matches("a") (oder gleichwertig) verwenden, um dieselbe Ausgabe wie zu erhalten:

mtcars %>% 
group_by(drat, am, gear, carb) %>% 
summarise(mpg=mean(mpg)) 

Ich bin nur an Antworten mit dplyr interessiert. Vielen Dank!


Die aktuelle Antwort, obwohl gut, erlaubt nur die Auswahl von Spalten mit einem Regex.

Ich bin immer noch auf der Suche nach einer globaleren Antwort, die die Verwendung der gesamten Auswahl von dplyr Auswahlsyntax erlauben würde. Natürlich kann ich jeden Regex massieren, um zu wählen, was ich will, aber ich wünschte, ich hätte etwas, das sich besser in dplyr integriert (vor allem, um die Syntax -colName zu verwenden). Ich werde das für eine Weile offen lassen.

Antwort

4

Hier ist eine Option Ihre eigenen group_at() zu konstruieren, das glaube ich nicht mit der matches und SE group_by_() Funktion vorhanden ist:

mtcars %>% 
     group_by_(.dots = names(mtcars)[matches("a", vars = names(mtcars))]) %>% 
     summarise(mpg = mean(mpg)) 

#Source: local data frame [26 x 5] 
#Groups: drat, am, gear [?] 

# drat am gear carb mpg 
# <dbl> <dbl> <dbl> <dbl> <dbl> 
#1 2.76  0  3  1 18.10 
#2 2.76  0  3  2 15.50 
#3 2.93  0  3  4 10.40 
#4 3.00  0  3  4 10.40 
#5 3.07  0  3  3 16.30 
#6 3.08  0  3  1 21.40 
#7 3.08  0  3  2 19.20 
#8 3.15  0  3  2 16.95 
#9 3.21  0  3  4 14.30 
#10 3.23  0  3  4 14.70 
# ... with 16 more rows 

oder äquivalent, nur verwenden grep:

mtcars %>% 
     group_by_(.dots = grep('a', names(mtcars), value = TRUE)) %>% 
     summarise(mpg=mean(mpg)) 
+2

Sie können Vermeiden Sie den Doppelaufruf zu den Namen mit 'grep (" a ", Namen (mtcars), val = TRUE)' –

+0

@PierreLafortune Richtig. Vergiss es. – Psidom

+0

Vielen Dank an beide, ich füge dies meinen praktischen Funktionen hinzu! 'group_at <- Funktion (df, Muster) group_by_ (df, .dots = grep (Namen (df), Muster = Muster, Wert = T))' –

Verwandte Themen