计算 R 中两个数据框中的总 N 和事件的总百分比

问题描述 投票:0回答:1

处理多个学期多个不同课程的数据集中的一些事件数据。我需要找出每周有多少学生“登录”课程,然后找到登录课程的百分比。

下面是一些示例代码:

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 似乎效率低下时,如何获得百分比?

r group-by percentage
1个回答
0
投票

类似这样的:

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) 计算百分比。

© www.soinside.com 2019 - 2024. All rights reserved.