处理多个学期多个不同课程的数据集中的一些事件数据。我需要找出每周有多少学生“登录”课程,然后找到登录课程的百分比。
下面是一些示例代码:
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 <- 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))
现在我想知道在任何给定的一周“登录”课程的百分比。我做了一些硬编码来让它运行,但我知道有更好的方法来做到这一点,对吧?这没关系,因为我的样本数据只有两门课程,但实际上我有很多课程。
下面是我添加了 ifelse 语句的 mutate 命令:
daily_events <- esl_lms_events %>%
mmutate(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)) %>%
mutate(stud_pct = ifelse(course_id==111 & term=='Fall 2000', (stud_event_count/2)*100,
ifelse(course_id==122 & term=='Fall 2000', (stud_event_count/1)*100,0)))
我计算了另一个查询中不同学生的总数,即 2 和 1 来自哪里。
stud_distr <- events %>%
group_by(term, course_id) %>%
reframe(stud_count = n_distinct(student_id))
当我有更多数据并且 ifelse 或 case/when 似乎效率低下时,如何获得百分比?
类似这样的:
daily_events_2 <- events %>% distinct() %>%
mutate(week=week(event_date)) %>%
mutate(stud_count = n_distinct(student_id),
.by = c(term, course_id)) %>%
summarise(total_events = n_distinct(event_date),
stud_event_count = n_distinct(student_id),
.by = c(course_id, term, week, stud_count)) %>%
mutate(stud_pct = stud_event_count / stud_count * 100)
我很少使用
reframe
。如果我需要将数据组合成一行,请使用 summarise
,或者使用 mutate
返回相同数量的行。
代码分 3 个步骤运行:(1) 计算每个学期和课程的不同学生总数,而不更改其他数据,(2) 计算计数,(3) 计算百分比。