Как я могу построить процент X для Y от общего числа X для категории Z - PullRequest
0 голосов
/ 20 марта 2020

Скажем, я хочу представить, как мои гипотетические ученики справляются со своими специальностями. В моем классе 32 студента. Фреймы данных 101. Что меня интересует, так это составление графика процентного соотношения учащихся на мажор в децилях класса.

Вот мой примерный фрейм данных.

# Grade Decile
grade <- c(90, 90, 90, 80, 80, 80, 80, 70, 70, 60, 50, 50)
# Student Major
major <- c("history", "math", "science", "history", "science", "english", "math", "english", "math", "english", "math", "history")
# Number of students per major per decile
num <- c(3, 6, 2, 3, 5, 2, 4, 5, 5, 2, 1, 1)

df <- data.frame(grade, major, num)

Затем я извлекаю только основные предметы по английскому языку sh.

df_english <- df[df$major == "english",]

Как рассчитать процент по английскому языку sh майоров из общего числа студентов, набравших баллы определенная оценка?

В конечном итоге я пытаюсь показать (с помощью этого гипотетического набора данных), сколько учеников, набравших определенную оценку, выбрали определенную специальность, но с учетом неравномерности числа учащихся в a majors.

Я пытался построить df_english $ num против df_english $ grade, деленного на nrow (df $ grade), но я думаю, что я здесь далеко от основания. Я также попытался снова добавить новый столбец, используя nrow (df $ grade), но без кубиков.

Приветствуются любые советы, критика, псевдокод, направление или фактический код. База R или что-то из тидиверса одинаково приветствуется.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Используя tapply, вы можете суммировать цифры по классам и основным специальностям. Затем просто разделите число основных валют по английскому на 1018 * на сумму всех, чтобы получить процент, который затем легко может быть равен barplot. Я использую данные игрушек с 50 специальностями и 50 классами.

tmp <- with(dat, t(tapply(num, list(grade, major), sum)))
calc <- tmp[rownames(tmp) == "EN"] / colSums(tmp)*100

b <- barplot(t(calc), ylim=c(0, 4.5), col="lightblue", xlab="Grade", ylab="Percent",
        main="Grades of english majors as percentage of all majors", xaxt="n", yaxt="n", border=FALSE)
box()
# x-axis
smj <- (1:50)[(1:50) %% 10 == 0]*.1
smn <- (1:50)*.1
axis(1, smj, at=b[seq(b) %% 10 == 0], tck=-.02, labels=F)
axis(1, smn, at=b, tck=-.01, labels=F)
mtext(formatC(smj, digits=1, format="f"), 1, 1, at=b[seq(b) %% 10 == 0])
# y-axis
axis(2, 1:50, at=1:50, labels=F)
mtext(paste(1:4, "%"), 2, 1, 0, at=1:4, las=2)

Результат

enter image description here


Игрушка данные

set.seed(43)
dat <- expand.grid(grade=(1:50)*.1, major=c("EN", "LH", "DU", "BE", "ZX", "XM", "GG", "BV", "GN", "IW", 
"AT", "SM", "VH", "ND", "YC", "NA", "YN", "XH", "JT", "TD", "GS", 
"EY", "RQ", "NY", "GD", "BS", "WF", "GJ", "XO", "FV", "TQ", "MU", 
"FH", "LT", "GP", "ZY", "AZ", "GK", "EU", "XL", "VI", "JC", "CI", 
"UM", "QU", "JX", "EE", "XJ", "XX", "DM"),
                   stringsAsFactors=F)
dat$num <- sample(1:10, nrow(dat), replace=TRUE)
1 голос
/ 20 марта 2020

Вот пара идей, использующих tidyverse:

library(tidyverse)
library(scales)

df %>%
  complete(major, grade, fill = list(num = 0)) %>%
  group_by(major) %>%
  mutate(sum = sum(num),
         perc = num/sum) %>%
  ggplot(aes(x = major, y = perc, fill = as.factor(grade), group = as.factor(grade))) +
  geom_bar(stat = "identity", position = position_dodge2(width = 0.5, preserve = "single"), width = .5) +
  scale_y_continuous(labels = percent)

Участок

percent vs. major by grade level

И, альтернативно,

df %>%
  group_by(grade) %>%
  mutate(sum = sum(num),
         perc = num/sum) %>%
  ggplot(aes(x = grade, y = perc, fill = major, group = major)) +
    geom_bar(stat = "identity", position = position_dodge2(width = 0.9, preserve = "single")) +
    scale_y_continuous(labels = percent)

Сюжет

percent vs grade by major

Вы также можете сложить бары до 100 % В качестве опции. Надеюсь, что это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...