R 4.1.2:动态检测累计错误模式并置后续答案为'disc'
处理答题数据的淘汰逻辑函数实现
构造示例数据
先创建符合需求的测试数据,模拟10名参与者的10道题答题情况:
set.seed(123) library(dplyr) library(tidyr) df <- tibble( playerID = 1:10, q1 = sample(c(0,1,2), 10, replace = TRUE), q2 = sample(c(0,1,2), 10, replace = TRUE), q3 = sample(c(0,1,2), 10, replace = TRUE), q4 = sample(c(0,1,2), 10, replace = TRUE), q5 = sample(c(0,1,2), 10, replace = TRUE), q6 = sample(c(0,1,2), 10, replace = TRUE), q7 = sample(c(0,1,2), 10, replace = TRUE), q8 = sample(c(0,1,2), 10, replace = TRUE), q9 = sample(c(0,1,2), 10, replace = TRUE), q10 = sample(c(0,1,2), 10, replace = TRUE) ) # 手动调整匹配需求:player3/8/9前3题累计错误3次,player5前7题累计错误3次 df <- df %>% mutate( across(q1:q3, ~ifelse(playerID %in% c(3,8,9), c(0,2,0), .)), across(q1:q7, ~ifelse(playerID ==5, c(0,1,2,0,1,0,2), .)) )
可配置参数的处理函数
实现核心逻辑,支持自定义错误阈值、参与者ID列名、题目列前缀:
discard_after_errors <- function(df, player_col = "playerID", question_prefix = "q", max_errors = 3) { # 提取所有题目列 question_cols <- grep(paste0("^", question_prefix), colnames(df), value = TRUE) df %>% # 宽表转长表,便于按题目顺序计算累计错误 pivot_longer(cols = all_of(question_cols), names_to = "question", values_to = "answer") %>% # 按参与者分组,严格按题目顺序排序 group_by({{player_col}}) %>% arrange(match(question, question_cols), .by_group = TRUE) %>% # 计算到当前题的累计错误数(0=答错、2=未答均算错误) mutate(cum_errors = cumsum(answer %in% c(0, 2))) %>% # 触发错误阈值后,后续题目改为"disc",触发题保留原答案 mutate( answer = case_when( cum_errors > max_errors ~ "disc", cum_errors == max_errors & lag(cum_errors, default = 0) < max_errors ~ as.character(answer), TRUE ~ as.character(answer) ) ) %>% # 转回宽表,恢复原列顺序 pivot_wider(names_from = "question", values_from = "answer") %>% ungroup() %>% select(all_of(colnames(df))) }
函数参数说明
df:输入的答题数据DataFrameplayer_col:参与者ID的列名,默认值为"playerID"question_prefix:题目列的前缀,默认匹配q1/q2这类格式的列max_errors:允许的累计错误(含未答)次数,默认值为3
测试函数
# 用默认阈值(3次错误)处理数据 result_df <- discard_after_errors(df) # 查看目标参与者的结果 result_df %>% filter(playerID %in% c(3,8,9)) result_df %>% filter(playerID == 5)
内容的提问来源于stack exchange,提问作者user15950867
相关产品推荐
相关产品推荐

