首页 > 解决方案 > dplyr 解决方案来制表长数据文件

问题描述

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

标签: rdplyr

解决方案


按'student'分组后,slice根据条件返回第一行'score'大于0且if all'score'为0的行,然后返回'grade'为max的行(which.max),分组通过'score',得到count(n())和mean'grade'

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  

推荐阅读