2016-03-28 11 views
5

Kennt jemand eine schnelle Möglichkeit zur Auswahl von "all-but-one" (oder "alle-aber-einige-wenigen") Spalten bei der Verwendung von dplyr::group_by? Letztendlich möchte ich nur nach Entfernen einiger ausgewählter Spalten über alle eindeutigen Zeilen aggregieren, aber ich möchte nicht jedes Mal alle Gruppierungsspalten explizit auflisten müssen (da diese in meiner Analyse häufig hinzugefügt und entfernt werden).Wählen Sie Minus-Operator in dplyr group_by

Beispiel:

> df <- data_frame(a = c(1,1,2,2), b = c("foo", "foo", "bar", "bar"), c = runif(4)) 
> df 
Source: local data frame [4 x 3] 

     a  b   c 
    (dbl) (chr)  (dbl) 
1  1 foo 0.95460749 
2  1 foo 0.05094088 
3  2 bar 0.93032589 
4  2 bar 0.40081121 

Jetzt möchte ich von a und b, aggregieren, so kann ich dies tun:

> df %>% group_by(a, b) %>% summarize(mean(c)) 
Source: local data frame [2 x 3] 
Groups: a [?] 

     a  b mean(c) 
    (dbl) (chr)  (dbl) 
1  1 foo 0.5027742 
2  2 bar 0.6655686 

Großen. Aber, würde ich wirklich gerne in der Lage sein, etwas zu tun wie nur geben nichtc, ähnlich wie dplyr::select(-c):

> df %>% select(-c) 
Source: local data frame [4 x 2] 

     a  b 
    (dbl) (chr) 
1  1 foo 
2  1 foo 
3  2 bar 
4  2 bar 

Aber group_by Ausdrücke anwenden können, so das Äquivalent nicht funktioniert:

> df %>% group_by(-c) %>% summarize(mean(c)) 
Source: local data frame [4 x 2] 

      -c mean(c) 
     (dbl)  (dbl) 
1 -0.95460749 0.95460749 
2 -0.93032589 0.93032589 
3 -0.40081121 0.40081121 
4 -0.05094088 0.05094088 

Wer weiß, wenn ich nur eine grundlegende Funktion oder Abkürzung fehlt, um mir das schnell zu tun?

Beispiel Anwendungsfall: Wenn df gewinnt plötzlich eine neue Spalte d, ich den Downstream-Code möchte nun Aggregat über eine einzigartige Kombination von a, b, undd, ohne ich ausdrücklich d zu den group_by hinzufügen zu müssen Tel.)

+3

'df%>% group_by _ (. Dots = setdiff (namen (df)," c "))%>% summieren (Mittelwert (c)) "Vielleicht? –

+0

Yup, das ist, worauf ich mich festgelegt habe, es scheint nur ... klobig, irgendwie. Ich dachte, es könnte eine (mir unbekannte) Funktion geben, die Ausdrücke wie "-c" vor einer sofortigen Auswertung schützt, die dann so behandelt werden kann, als wären sie in einem "Auswahl" -Aufruf gemacht worden. Aber im Allgemeinen, ja, 'group_by_' und' setdiff' können den Trick machen, danke! – mmuurr

+0

Ich stimme zu, dass man denken könnte, dass dies funktionieren sollte, da dies wie eine typische dplyr-Syntax aussieht. Vielleicht nachsehen, ob FR auf GH existiert, oder vielleicht wurde dies in der Entwicklungsversion implementiert. Wenn nicht, könnten Sie eine FR machen und sehen, wie es geht. –

Antwort

1

In aktuellen Versionen von dplyr, die Funktion group_by_at zusammen mit vars, erreicht dieses Ziel:

df %>% group_by_at(vars(-c)) %>% summarize(mean(c)) 
# A tibble: 2 x 3 
# Groups: a [?] 
     a  b `sum(c)` 
    <dbl> <chr>  <dbl> 
1  1 foo 0.9851376 
2  2 bar 1.0954412 

Wird in dplyr 0.7.0 eingeführt, im Juni 2017

Verwandte Themen