2017-05-29 1 views
1

Ich versuche, eine gruppierte Zusammenfassung zu erstellen, die die Anzahl der Datensätze in jeder Gruppe meldet und dann auch die Mittelwerte einer Reihe von Variablen zeigt.So kombinieren Sie zwei verschiedene dplyr-Zusammenfassungen in einem einzigen Befehl

Ich kann nur herausfinden, wie dies als zwei separate Zusammenfassungen tun, die ich dann zusammenführe. Das funktioniert gut, aber ich frage mich, ob es einen eleganteren Weg gibt, dies zu tun?

dailyn<-daily %>% # this summarises n 
    group_by(type) %>% 
    summarise(n=n()) %>% 

dailymeans <- daily %>% # this summarises the means 
    group_by(type) %>% 
    summarise_at(vars(starts_with("d.")),funs(mean(., na.rm = TRUE))) %>% 

dailysummary<-inner_join(dailyn,dailymeans) #this joins the two parts together 

Die Daten, die ich mit Arbeit bin ein Datenrahmen wie folgt aus:

daily<-data.frame(type=c("A","A","B","C","C","C"), 
        d.happy=c(1,5,3,7,2,4), 
        d.sad=c(5,3,6,3,1,2)) 
+0

Können Sie eine Stichprobe Ihrer Daten teilen? – Sotos

Antwort

3

Sie können dies in einem Anruf tun, durch Gruppierung, anstelle von summarize mutieren, und verwenden Sie dann slice() die erste Zeile jeder Art zu halten:

daily %>% group_by(type) %>% 
    mutate(n = n()) %>% 
    mutate_at(vars(starts_with("d.")),funs(mean(., na.rm = TRUE))) %>% 
    slice(1L) 

Edit: Es könnte klarer sein, wie das funktioniert, in diesem modifizierten Beispiel

daily_summary <- daily %>% group_by(type) %>% 
    mutate(n = n()) %>% 
    mutate_at(vars(starts_with("d.")),funs("mean" = mean(., na.rm = TRUE))) 

daily_summary 
# Source: local data frame [6 x 6] 
# Groups: type [3] 
# 
# # A tibble: 6 x 6 
# type d.happy d.sad  n d.happy_mean d.sad_mean 
# <fctr> <dbl> <dbl> <int>  <dbl>  <dbl> 
#1  A  1  5  2  3.000000   4 
#2  A  5  3  2  3.000000   4 
#3  B  3  6  1  3.000000   6 
#4  C  7  3  3  4.333333   2 
#5  C  2  1  3  4.333333   2 
#6  C  4  2  3  4.333333   2 

daily_summary %>% 
    slice(1L) 

# Source: local data frame [3 x 6] 
# Groups: type [3] 
# 
# # A tibble: 3 x 6 
# type d.happy d.sad  n d.happy_mean d.sad_mean 
# <fctr> <dbl> <dbl> <int>  <dbl>  <dbl> 
#1  A  1  5  2  3.000000   4 
#2  B  3  6  1  3.000000   6 
#3  C  7  3  3  4.333333   2 
+0

Das funktioniert wunderbar, aber ich verstehe nicht, was es tut. Wenn du sagst "behalte die erste Reihe jedes Typs" was ist das? Warum enthält die erste Zeile die Mittel? – mob

+1

Die Verwendung von muate anstelle von summarize stellt sicher, dass wir alle Daten behalten und sowohl Ihre Zähl- als auch Ihre mittleren Berechnungen im selben Datenrahmen durchführen können. Wenn Sie sich das Ergebnis ansehen, bevor Sie die Funktion slice() verwenden, sehen Sie, dass Sie einen gruppierten Datenrahmen mit drei Typen haben und dass Sie immer noch eine Zeile für jede Beobachtung haben. 'slice (1L)' behält dann die erste Zeile jedes Typs (wobei Typ die Variable ist, nach der wir gruppiert sind). – emiltb

+0

Umzuformulieren: Wenn muate_at verwendet wird, enden alle Zeilen mit der Anzahl und dem Mittelwert (siehe mein aktuelles Beispiel), also ist es nicht wichtig, dass wir die erste Zeile behalten. Es könnte irgendeine Reihe sein. – emiltb

1

Ähnlich this question, können Sie versuchen:

Source: local data frame [3 x 4] 
Groups: type [3] 

    type d.happy d.sad  n 
    <fctr> <dbl> <dbl> <int> 
1  A 3.000000  4  2 
2  B 3.000000  6  1 
3  C 4.333333  2  3 
:

daily %>% 
    group_by(type) %>% 
    mutate(n = n()) %>% 
    mutate_at(vars(starts_with("d.")),funs(mean(., na.rm = TRUE))) %>% 
    unique 

die gibt

+0

Dies funktioniert gut für die Beispieldaten, die ich gab, aber mein tatsächlicher Datensatz hat eine ganze Reihe von zusätzlichen Spalten. Aus irgendeinem Grund funktioniert die Gruppierung nicht, wenn die zusätzlichen Spalten vorhanden sind. – mob

+1

Nun, wir können nur mit den Beispieldaten arbeiten, sorry. Bitte lesen [hier] (https://stackoverflow.com/help/mcve) – Aramis7d

Verwandte Themen