在R中基于数据框高效计算多课程每周学生登录占比
高效计算多学期多课程每周登录学生占比的方法
问题背景
需要处理跨多学期、多课程的事件数据,核心需求是统计每周登录课程的学生人数,以及该人数占对应课程学期总学生数的百分比。目前通过硬编码ifelse语句实现,但数据量较大时效率极低。已生成两个数据框:
daily_events:按课程、学期、周统计的每周登录学生数等信息stud_distr:按学期、课程统计的对应学期课程总学生数
现有数据与代码
事件数据示例:
events <- data.frame(student_id= c(101, 101, 101, 102, 102, 102, 155, 155, 155, 101, 101), event_date=as.Date(c("11/09/2000","11/10/2000","11/12/2000", "11/09/2000","11/10/2000", "11/12/2000", "11/09/2001","11/14/2001","11/15/2001", "11/09/2001","11/15/2001"), "%m/%d/%Y"), course_id=c(111,111,122, 111,111,111, 122,122,122, 111,111), term=c("Fall 2000","Fall 2000", "Fall 2000", "Fall 2000","Fall 2000", "Fall 2000", "Fall 2001","Fall 2001", "Fall 2001", "Fall 2001","Fall 2001"))
生成daily_events的代码:
library(dplyr) library(lubridate) daily_events <- events %>% mutate(daily_event_count = ymd(event_date)) %>% group_by(course_id, term, week=week(event_date)) %>% reframe(total_events = n_distinct(event_date), stud_event_count = n_distinct(student_id))
生成stud_distr的代码:
stud_distr <- events %>% group_by(term, course_id) %>% reframe(stud_count = n_distinct(student_id))
高效解决方案
硬编码ifelse属于逐行判断,效率低下。正确的做法是利用数据框连接(join)将总学生数匹配到每周统计数据中,再通过矢量化计算百分比,这是处理大规模数据的最优方式。
实现步骤
- 使用
left_join通过term和course_id两个键,将stud_distr中的总学生数合并到daily_events中 - 直接计算每周登录学生数占总学生数的百分比,无需逐行判断
代码示例
# 合并数据并计算百分比 weekly_stud_percent <- daily_events %>% left_join(stud_distr, by = c("term", "course_id")) %>% mutate(stud_percent = (stud_event_count / stud_count) * 100) %>% # 可选:保留需要的列,调整顺序 select(course_id, term, week, stud_event_count, stud_count, stud_percent, total_events) # 查看结果 print(weekly_stud_percent)
效果说明
- 连接操作是矢量化的,比逐行
ifelse效率提升几个数量级,尤其适合大规模数据 - 匹配逻辑清晰,
term+course_id的组合确保每个课程学期的总学生数准确对应到每周数据 - 计算过程简洁,避免了硬编码维护的繁琐
内容的提问来源于stack exchange,提问作者ddbd1417
相关产品推荐
相关产品推荐

