Muszę podzielić ramkę danych i obliczyć niektóre podsumowania na podstawie różnych kombinacji grup dwóch zmiennych kategorialnych: członkostwa i płci. Na przykład:

set.seed(123)

df <- data.frame( YEAR = c("1999", "1999", "1999", "1999", "2001", "2000","2000", "2000", 
"1999","2000", "2000","1999", "2000", "2001", "2001", "2001", "2001"),
Sex=c("M", "M","M", "F", "M","M", "F","F", "F", "M", "F","F", "M", "M", "M", "F", "F"),
Membership = rep(c("YES", "NO"), each = 2), 
Income  = sample(1:10000, 17), 
Taxes = sample(1:100, 17))

Dla każdego roku i każdej z czterech możliwych kombinacji grup (K, Tak), (M, NIE), (K, Tak), (K, NIE) Muszę się dowiedzieć, jaki jest stosunek całkowitego dochodu każdej grupy i wielki dochód wszystkich grup w tym roku. To samo dotyczy kolumny podatków.

Na przykład dla 1999 i (M, N) wynik powinien wynosić (986 + 4233) / 986 + 4233 + 9954 + 4776 + 8536) = 0,1832

Masz jakiś pomysł, jak to zdobyć? Dziękuję Ci

0
gogo88 29 czerwiec 2020, 23:26

2 odpowiedzi

Najlepsza odpowiedź

Zrobiłbym coś takiego ...

library(tidyverse)
df %>%
  group_by(YEAR, Sex, Membership) %>%
  summarize(GroupIncome = sum(Income), GroupTaxes = sum(Taxes)) %>%
  group_by(YEAR) %>%
  mutate(TotalIncomeForYear = sum(GroupIncome),
         GroupPercentIncome = GroupIncome / TotalIncomeForYear,
         TotalTaxesForYear = sum(GroupTaxes),
         GroupPercentTaxes = GroupTaxes / TotalTaxesForYear) %>%
  ungroup()

Co daje taką ramkę danych ...

Calculation results

2
Jason Punyon 29 czerwiec 2020, 20:39

Poniższy kod używa pakietu dplyr do

  1. Oblicz sumy YEAR z Income i Taxes,
  2. oblicz sumy Income i Taxes przez grupy YEAR, Sex, Membership,
  3. w tej samej instrukcji podziel te ostatnie sumy przez sumy obliczone wcześniej przez YEAR.

Rozgrupuj wynik.

library(dplyr)

df %>%
  group_by(YEAR) %>%
  mutate(SumYearIncome = sum(Income),
         SumYearTaxes = sum(Taxes)) %>%
  ungroup() %>%
  group_by(YEAR, Sex, Membership) %>%
  mutate(RatioGroupIncome = sum(Income)/SumYearIncome,
         RatioGroupTaxes = sum(Taxes)/SumYearTaxes) %>%
  ungroup() %>%
  select(-SumYearIncome, -SumYearTaxes)
1
Rui Barradas 29 czerwiec 2020, 20:39