Решение dplyr для табулирования длинного файла данных - PullRequest
0 голосов
/ 30 июня 2019
data=data.frame("student"=c(1,1,1,1,2,2,2,3,3,3,3,4,4,4,4),
"year"=c(2014,2015,2016,2017,2014,2015,2016,2014,2015,2016,2017,2014,2015,2016,2017),
"grade"=c(9,10,11,12,9,10,11,9,10,11,12,9,10,11,12),
"score"=c(0,0,0,0,0,0,2,0,1,1,2,0,0,1,1))

Для каждого учащегося я хочу указать первый балл> 0 и оценку, в которой это происходит. Если ученик не набирает балл> 0, я хочу сообщить о максимальной оценке этого ученика.

Мой обнадеживающий вывод - таблица, показывающая счет каждого балла и средний балл.

Я делаю это вручную, чтобы получить:

оценка = 0, количество = 1, средняя оценка = 12

оценка = 1, количество = 2, средняя оценка = 10,5

оценка = 2, счет = 1, средняя оценка = 11

1 Ответ

3 голосов
/ 30 июня 2019

После группировки по 'студенту', slice основано на условии возврата строк с первой строкой, где 'оценка' больше 0 и if all 'оценка' равна 0, а затем возвращаетстрока, в которой «оценка» является максимальной (which.max), сгруппированная по «оценке», получить количество (n()) и mean «оценки»

library(dplyr)
data %>% 
   group_by(student) %>% 
   slice(if(all(score == 0)) which.max(grade) else which.max(score > 0)) %>% 
   group_by(score) %>%
   summarise(count = n(), mean_grade = mean(grade))
# A tibble: 3 x 3
#  score count mean_grade
#  <dbl> <int>      <dbl>
#1     0     1       12  
#2     1     2       10.5
#3     2     1       11  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...