2016-11-15 2 views
2

Häufig benutze ich die Funktionen group_by() und summarize() (Anmerkung: Dies ist die gleiche wie count() Funktion, wenn die Auswertungsstatistik sum() ist) Funktionen im dplyr Paket in R.Suche Anteil für gruppierte Beobachtungen mit dplyr in R

Hier ist ein Beispiel dafür, wie:

library(dplyr) 

data <- data.frame(
    group = sample(rep(c("Group A", "Group B", "Group C", "Group D"), 4), 16, replace = F), 
    factor = sample(rep(c("Factor 1", "Factor 2"), 8), 16, replace = F), 
    var1 = sample(1:16) 
) 

Hier ist die Ausgabe:

out_df <- 
    data %>% 
     group_by(group) %>% 
     summarize(sum_var1 = sum(var1)) 

print(out_df) 

Source: local data frame [7 x 3] 
Groups: group [4] 

    group factor sum_var1 
    <fctr> <fctr> <int> 
1 Group A Factor 1  29 
2 Group B Factor 1  8 
3 Group C Factor 1  33 
4 Group D Factor 1  12 
5 Group A Factor 2  27 
6 Group B Factor 2  10 
7 Group C Factor 2  17 

Nun, ich möchte viele Male, welchen Anteil jeder sum_var1 Variable zu finden ist, nicht als Anteil an der Gesamtsumme, aber als Anteil der Summe für eine Ebene eines Faktors, wie die factor Variable hier.

ich tun dies in der Regel von der Suche, wie die Summe für jede Ebene des Faktors, und dann Dividieren manuell die Beobachtungen durch, wie die folgenden:

out_df %>% group_by(factor) %>% summarize(factor_sum = sum(sum_var1)) 
to_divide <- (c(rep(82, 4), rep(54, 4))) 
out_df$factor_prop_sum_var1 <- out_df$sum_var1/to_divide 

Diese auf den gewünschten Ausgang führt, und ich kann prüfen, ob die sum von factor_prop_sum_var1 gleich 1:

out_df 

Source: local data frame [8 x 4] 
Groups: group [4] 

    group factor sum_var1 factor_prop_sum_var1 
    <fctr> <fctr> <int>    <dbl> 
1 Group A Factor 1  26   0.3170732 
2 Group B Factor 1  17   0.2073171 
3 Group C Factor 1  19   0.2317073 
4 Group D Factor 1  18   0.2195122 
5 Group A Factor 2  8   0.1481481 
6 Group B Factor 2  19   0.3518519 
7 Group C Factor 2  7   0.1296296 
8 Group D Factor 2  22   0.4074074 

out_df %>% group_by(factor) %>% summarize(checking = sum(factor_prop_sum_var1)) 

# A tibble: 2 × 2 
    factor checking 
    <fctr> <dbl> 
1 Factor 1  1 
2 Factor 2  1 

Dies funktioniert, aber es ist sehr klobig am besten. Gibt es eine Möglichkeit, dies mehr, äh, elegant (vorzugsweise innerhalb der dplyr "Pipeline") zu tun?

Antwort

3

Um Proportionen innerhalb von Gruppen zu erhalten, gruppieren Sie sich nur nach den Spalten, in denen die Proportionen zu 100% addiert werden sollen. Also, in diesem Fall, nach dem Erhalten der Summe für jede Kombination von group und factor, verwenden Sie wieder group_by, aber diese Zeitgruppe nur durch factor und berechnen Sie dann Prozentsätze.

library(dplyr) 

set.seed(100) 
data <- data.frame(
    group = sample(rep(c("Group A", "Group B", "Group C", "Group D"), 4), 16, replace = F), 
    factor = sample(rep(c("Factor 1", "Factor 2"), 8), 16, replace = F), 
    var1 = sample(1:16) 
) 

data %>% 
    group_by(group, factor) %>% 
    summarize(sum_var1 = sum(var1)) %>% 
    group_by(factor) %>% 
    mutate(percent = sum_var1/sum(sum_var1)) %>% 
    arrange(factor) 
group factor sum_var1 percent 
1 Group A Factor 1  13 0.25000000 
2 Group B Factor 1  8 0.15384615 
3 Group C Factor 1  21 0.40384615 
4 Group D Factor 1  10 0.19230769 
5 Group A Factor 2  20 0.23809524 
6 Group B Factor 2  27 0.32142857 
7 Group C Factor 2  2 0.02380952 
8 Group D Factor 2  35 0.41666667 
Verwandte Themen