You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)将总学生数匹配到每周统计数据中,再通过矢量化计算百分比,这是处理大规模数据的最优方式。

实现步骤

  1. 使用left_join通过term和course_id两个键,将stud_distr中的总学生数合并到daily_events中
  2. 直接计算每周登录学生数占总学生数的百分比,无需逐行判断

代码示例

# 合并数据并计算百分比
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:40:19