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

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:输入的答题数据DataFrame
  • player_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:44