2016-03-28 15 views
5

Qualcuno sa di un modo veloce per selezionare le colonne "tutto-ma-uno" (o "tutto-ma-a-pochi") quando si utilizza dplyr::group_by? In definitiva, voglio solo aggregare tutte le righe distinte dopo aver rimosso alcune colonne selezionate, ma non voglio dover elencare esplicitamente tutte le colonne di raggruppamento ogni volta (dal momento che vengono aggiunte e rimosse un po 'di frequente nella mia analisi).seleziona meno operatore in dplyr group_by

Esempio:

> 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 

Ora voglio aggregare da a e b, così posso fare questo:

> 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 

Grande. Ma, mi piacerebbe davvero piace essere in grado di fare qualcosa di simile basta specificare nonc, simile a 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 

Ma group_by può applicare espressioni, quindi l'equivalente non funziona:

> 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 

Qualcuno sa se mi manca solo una funzione di base o una scorciatoia per aiutarmi a farlo rapidamente?

Esempio caso d'uso: se df guadagna improvvisamente una nuova colonna d, mi piacerebbe il codice a valle ad oggi aggregato su combinazioni uniche di a, b, ed, senza di me dover aggiungere in modo esplicito d al group_by . chiamare)

+3

'df%>% group_by _ (. Punti = setdiff (nomi (df)," c "))%>% riepiloga (media (c)) 'forse? –

+0

Sì, questo è quello che ho deciso, sembra solo ... goffo, in qualche modo. Ho pensato che potrebbe esserci una funzione (a me sconosciuta) che 'protegge' espressioni come '-c' dalla valutazione immediata che possono essere trattate come se fossero state fatte in una chiamata' select'. Ma in generale, sì, 'group_by_' e' setdiff' possono fare il trucco, grazie! – mmuurr

+0

Sono d'accordo sul fatto che si potrebbe pensare che questo dovrebbe funzionare in quanto sembra una tipica sintassi di dplyr Forse si cerca se c'è già un FR su GH, o forse questo è stato implementato nella versione di sviluppo. In caso contrario, potresti fare un FR e vedere come va. –

risposta

1

Nelle attuali versioni di dplyr, la funzione group_by_at, insieme a vars, realizza questo obiettivo:

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 

Sembra essere stato introdotto in dplyr 0.7.0, nel giugno 2017

Problemi correlati