Используя dplyr, подсчитайте нечисленные c оценки в каждом классе - PullRequest
1 голос
/ 15 января 2020

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

**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 ]

4 голосов
/ 15 января 2020

Мы можем использовать 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')])
1 голос
/ 16 января 2020

Вот базовое решение 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
...