2014-07-16 8 views
6

Sto appena iniziando con ddply e trovandolo molto utile. Voglio riassumere un frame di dati e anche eliminare alcune righe nell'output finale in base al fatto che la colonna di riepilogo abbia un valore particolare. Questo è come HAVING e GROUP BY in SQL. Ecco un esempio:Un modo per filtrare e riepilogare in ddply?

input = data.frame(id=  c(1, 1, 2, 2, 3, 3), 
        metric= c(30,50,70,90,40,1050), 
        badness=c(1, 5, 7, 3, 3, 99)) 
intermediateoutput = ddply(input, ~ id, summarize, 
          meanMetric=mean(metric), 
          maxBadness=max(badness)) 
intermediateoutput[intermediateoutput$maxBadness < 50,1:2] 

Questo dà:

id meanMetric 
1 1   40 
2 2   80 

che è quello che voglio, ma posso farlo in un unico passaggio all'interno della ddply dichiarazione in qualche modo?

+4

Se non sei già molto impegnato con 'plyr', allora potresti trarre beneficio dall'andare direttamente a' dplyr' che è la versione nuova e migliorata. – Ben

+2

Assicurati di non averli entrambi caricati allo stesso tempo –

risposta

11

Provare con dplyr. E 'più veloce, e il codice è molto più facile da leggere e capire, soprattutto se si utilizza tubi (%>%):

input %>% 
    group_by(id) %>% 
    summarize(meanMetric=mean(metric), maxBadness=max(badness)) %>% 
    filter(maxBadness <50) %>% 
    select(-maxBadness) 

seguente commento @Arun, è possibile semplificare il codice in questo modo:

input %>% 
    group_by(id) %>% 
    filter(max(badness)<50) %>% 
    summarize(meanMetric=mean(metric)) 
+1

Esiste un modo equivalente in 'dplyr' per' as.data.table (input) [, lista (meanMetric = mean (metrico) [max (badness) <50]), per = id] '? – Arun

+1

Sì hai ragione @Arun (come sempre!). Il codice può essere semplificato perché non devi calcolare la variabile 'maxBadness' per il filtraggio. Aggiunto come una modifica, penso che questo sia più o meno l'equivalente del tuo codice 'data.table'. – juba

Problemi correlati