2014-07-16 13 views
6

Właśnie zaczynam od ddply i uważam, że jest to bardzo przydatne. Chcę podsumować ramkę danych, a także pozbyć się niektórych wierszy w końcowym wyniku na podstawie tego, czy sumowana kolumna ma określoną wartość. To jest jak HAVING, a także GROUP BY w SQL. Oto przykład:W jaki sposób można filtrować, a także podsumowywać w 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] 

Daje:

id meanMetric 
1 1   40 
2 2   80 

co jest to, co chcę, ale mogę to zrobić w jednym etapie w rachunku ddply jakoś?

+4

Jeśli nie jesteś już mocno zaangażowany w 'plyr', to możesz odnieść korzyść bezpośrednio z' dplyr', która jest nową i ulepszoną wersją. – Ben

+2

Po prostu upewnij się, że nie masz ich obu załadowanych w tym samym czasie. –

Odpowiedz

11

Powinieneś spróbować z dplyr. Jest szybszy, a kod jest znacznie łatwiejsze do odczytania i zrozumienia, zwłaszcza jeśli używasz potoków (%>%):

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

Obserwuje @Arun komentarza, można uprościć kod w ten sposób:

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

Czy istnieje równoważny sposób w 'dplyr' dla' as.data.table (input) [, list (meanMetric = mean (metric) [max (badness) <50]), przez = id] '? – Arun

+1

Tak, masz rację @Arun (jak zawsze!). Kod można uprościć, ponieważ nie trzeba obliczać zmiennej 'maxBadness' do filtrowania. Dodałem go jako edycję, myślę, że jest to mniej więcej odpowiednik twojego kodu 'data.table'. – juba

Powiązane problemy