Составление кадра данных пропорций, по крайней мере, 3-мя отдельными факторами, в R - PullRequest
0 голосов
/ 23 января 2020

У меня есть фрейм данных, в котором я хочу рассчитать количество и столбец пропорции или процента по 3 различным факторам. В этом примере это будет по штату, полу и возрасту.

state <- rep(c(rep("Idaho", 10), rep("Maine", 10)), 2)
student.id <- sample(1:1000,8,replace=T)
gender <- rep( c("Male","Female"), 100*c(0.25,0.75) )  
gender <- sample(gender, 40)
age <- rep( c("Primary school","Secondary school"), 100*c(0.5,0.5) )
age <- sample(age, 40)
school.data <- data.frame(student.id, state, gender, age)

Для расчета этого с двумя факторами очень хорошее решение здесь: dplyr для создания совокупного процента уровней факторов

Но при использовании кода для> 2 факторов решение дает неверные значения в столбце пропорций. Кто-нибудь знает, как найти пропорции при взгляде хотя бы на 3 фактора?

Код, который я пробовал:

proportions <- group_by(school.data, state, gender, age) %>% 
  summarize(n = length(student.id)) %>%
  ungroup %>% group_by(state) %>% 
  mutate(proportion = n / sum(n)) 

В пропорциях df я хочу, чтобы пропорции были, например: Айдахо женская начальная школа против Айдахо женская средняя школа. Таким образом, соотношение основано на 1 факторе, когда остальные 2 фактора являются постоянными. И я хотел бы рассчитать эти цифры по всей DF. Но числа пропорций, которые генерирует код, не соответствуют этим.

Я хочу, чтобы данные были в этом формате, чтобы я мог создать столбчатую диаграмму в ggplot с возможностью печати чисел или процентов в верхней части. столбцов, как они здесь Отображение значений данных на гистограмме с накоплением в ggplot2

1 Ответ

1 голос
/ 24 января 2020

Я думаю, вам просто не хватает "возраста" во втором gropu_by. следующий код, кажется, производит правильные пропорции.

library(tidyverse)
state <- rep(c(rep("Idaho", 10), rep("Maine", 10)), 2)
student.id <- sample(1:1000,8,replace=T)
gender <- rep( c("Male","Female"), 100*c(0.25,0.75) )  
gender <- sample(gender, 40)
age <- rep( c("Primary school","Secondary school"), 100*c(0.5,0.5) )
age <- sample(age, 40)
school.data <- data.frame(student.id, state, gender, age)

proportions <- group_by(school.data, state, gender, age)%>% 
  summarize(n = length(student.id)) %>%
  ungroup %>% group_by(state, gender) %>% 
  mutate(proportion = n / sum(n)) 

т

State   gender  Age             n   proportion
-------------------------------------------------
Idaho   Female  Primary school  4   0.3076923
Idaho   Female  Secondary school    9   0.6923077
Idaho   Male    Primary school  2   0.2857143
Idaho   Male    Secondary school    5   0.7142857
Maine   Female  Primary school  8   0.5714286
Maine   Female  Secondary school    6   0.4285714
Maine   Male    Primary school  4   0.6666667
Maine   Male    Secondary school    2   0.3333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...