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?