2014-07-16 13 views
6

Ich fange gerade mit ddply an und finde es sehr nützlich. Ich möchte einen Datenrahmen zusammenfassen und auch einige Zeilen in der endgültigen Ausgabe loswerden, abhängig davon, ob die zusammengefasste Spalte einen bestimmten Wert hat. Dies ist wie HAVING sowie GROUP BY in SQL. Hier ein Beispiel:Sie können sowohl filtern als auch in ddply zusammenfassen?

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] 

Das gibt:

id meanMetric 
1 1   40 
2 2   80 

das ist, was ich will, aber kann ich es in einem einzigen Schritt in der ddply Aussage irgendwie?

+4

Wenn Sie sich nicht schon stark für 'plyr' engagieren, können Sie direkt von' dplyr' profitieren, welches die neue und verbesserte Version ist. – Ben

+2

Stellen Sie sicher, dass Sie nicht beide gleichzeitig geladen haben. –

Antwort

11

Sie sollten versuchen mit dplyr. Es ist schneller, und der Code ist viel einfacher zu lesen und zu verstehen, besonders wenn man Rohre verwenden (%>%):

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

Nach @Arun Kommentar, Sie den Code auf diese Weise vereinfachen:

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

Gibt es einen äquivalenten Weg in 'dplyr' für' as.data.table (Eingabe) [, Liste (meanMetric = mean (metrisch) [max (Schlechtigkeit) <50]), durch = id] '? – Arun

+1

Ja, du hast Recht @Arun (wie immer!). Der Code kann vereinfacht werden, da Sie die Variable "maxBadness" zum Filtern nicht berechnen müssen. Ich habe es als Bearbeitung hinzugefügt, ich denke, das entspricht mehr oder weniger dem 'data.table' Code. – juba

Verwandte Themen