2014-10-24 10 views
30

Ho un data.frame che contiene i nomi dei client, gli anni e diversi numeri di entrate di ogni anno.Dplyr - Disponi un grouped_df per variabile di gruppo non funzionante

df <- data.frame(client = rep(c("Client A","Client B", "Client C"),3), 
       year = rep(c(2014,2013,2012), each=3), 
       rev = rep(c(10,20,30),3) 
       ) 

Voglio finire con un data.frame che aggrega il fatturato per cliente e anno. Quindi desidero ordinare la data.frame per anno, quindi ricavandone le entrate.

library(dplyr) 
df1 <- df %>% 
     group_by(client, year) %>% 
     summarise(tot = sum(rev)) %>% 
     arrange(year, desc(tot)) 

Tuttavia, quando si utilizza il codice sopra la funzione arrange() non cambia l'ordine del data.frame raggruppate affatto. Quando eseguo il codice sottostante e coercio a un normale data.frame funziona.

library(dplyr) 
    df1 <- df %>% 
      group_by(client, year) %>% 
      summarise(tot = sum(rev)) %>% 
      data.frame() %>% 
      arrange(year, desc(tot)) 

mi sto perdendo qualcosa o avrò bisogno di fare questo ogni volta quando si cerca di arrange un grouped_df da una variabile raggruppate?

R Versione: 3.1.1 dplyr versione del pacchetto: 0.3.0.2

EDIT 2017/11/13: Come notato da lucacerone, a cominciare da dplyr 0.5, organizzare ancora una volta ignora i gruppi durante l'ordinamento. Quindi il mio codice originale ora funziona nel modo in cui inizialmente mi aspettavo.

arrangiare() ancora una volta ignora il raggruppamento, ripristinando il comportamento di dplyr 0.3 e precedenti. Questo rende arrangiante() incoerente con altri verbi dplyr, ma penso che questo comportamento sia generalmente più utile. Indipendentemente da ciò, non cambierà di nuovo, poiché ulteriori cambiamenti causeranno solo più confusione.

risposta

65

prova a cambiare l'ordine della vostra group_by dichiarazione:

df %>% 
    group_by(year, client) %>% 
    summarise(tot = sum(rev)) %>% 
    arrange(year, desc(tot)) 

Penso arrange sta ordinando all'interno dei gruppi; dopo summarize, l'ultimo gruppo viene rilasciato, quindi questo significa che nel primo esempio si organizzano le righe all'interno del gruppo client. Passare a group_by(year, client) sembra risolvere il problema perché il gruppo client viene rilasciato dopo lo summarize.

In alternativa, c'è la funzione ungroup()

df %>% 
    group_by(client, year) %>% 
    summarise(tot = sum(rev)) %>% 
    ungroup() %>% 
    arrange(year, desc(tot)) 
+5

dal dplyr 0.5 questo non funziona più: '' 'rottura cambia organizzare() ignora ancora una volta il raggruppamento, tornando indietro al comportamento dei dplyr 0.3 e precedenti . Questo rende arrangiante() incoerente con altri verbi dplyr, ma penso che questo comportamento sia generalmente più utile. Indipendentemente da ciò, non cambierà di nuovo, poiché ulteriori cambiamenti causeranno solo più confusione. '' – lucacerone

+2

Questo commento deve essere più visibile. Sfortunatamente la modifica, quindi, cambia con il comportamento di arrangiamento, in questo stadio molte risposte StackOverflow vecchie e altamente potenziate risultano errate. –

Problemi correlati