Используя dplyr, подсчитайте нечисловые оценки в каждом классе

Учитывая ввод и код ниже, используя dplyr и группы, как я могу получить результаты, показанные в выводе? Я знаю, как суммировать столбцы в группах, используя dplyr, но в этом случае мне нужно посчитать, сколько из каждого нечислового уровня было в каждом классе.

**INPUT**
Class Student   Grade
1       Jack    C
1       Mary    B
1       Mo      B
1       Jane    A
1       Tom     C
2       Don     C
2       Betsy   B
2       Sue     C
2       Tayna   B
2       Kim     C
**CODE**
  # Create the dataframe 
    Class <- c(1,1,1,1,1,2,2,2,2,2)
    Name <- c("Jack", "Mary", "Mo", "Jane", "Tom", "Don", "Betsy", "Sue", "Tayna", "Kim")
    Grade <- c("C","B","B","A","C","C","B","C","B","C")
    StudentGrades <- data.frame(Class, Name, Grade)
**OUTPUT**
Class   Grade-A Grade-B Grade-C
1       1       2       2
2       0       2       3

Всего 2 ответа


Мы можем использовать count для count частоты, а затем с pivot_wider изменить с «длинного» на «широкий» формат

library(dplyr)
library(tidyr)
library(stringr)
StudentGrades %>%
    count(Class, Grade = str_c('Grade_', Grade)) %>%
    pivot_wider(names_from = Grade, values_from = n, values_fill = list(n = 0))
# A tibble: 2 x 4
#  Class Grade_A Grade_B Grade_C
#   <dbl>   <int>   <int>   <int>
#1     1       1       2       2
#2     2       0       2       3

Или в base R

table(StudentGrades[c('Class', 'Grade')])

Вот базовое решение R, где используются table() + split()

dfout <- do.call(rbind,lapply(split(StudentGrades,StudentGrades$Class), 
       function(v) c(unique(v[1]),table(v$Grade))))

такой, что

> dfout
  Class A B C
1 1     1 2 2
2 2     0 2 3

Есть идеи?

10000