如何统计参与者累计两次正确回答前的错误数、试验次数及耗时?
问题与解决方案
问题描述
我有一个数据集,每行代表参与者的一次正确/错误交互。需要完成两个任务:
- 统计每个参与者在记录到两次正确回答之前的错误交互次数
- 创建新变量,记录满足「累计两次正确回答」条件时的试验次数,同时新增一列计算该条件前的耗时
数据集代码如下:
id = c(1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3) accuracy = c(0,1,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,1) timestamp = c(2405.078,2409.575,2414.239,2419.084,2424.138,2428.510,805.5845,812.2674,817.6420,822.5424,828.0416,832.9703,842.2013,456.9943,463.0222,469.0649,475.2177,480.3976,486.9402,491.5632,497.0068) df <- data.frame(id, accuracy, timestamp)
期望的试验次数结果示例:
| ID | trial_count |
|---|---|
| 1 | 5 |
| 2 | 5 |
| 3 | 4 |
解决方案
使用dplyr包按参与者分组处理,逐行计算累计正确次数,定位到第一次达到2次正确的试验,再推导所需指标:
library(dplyr) result <- df %>% group_by(id) %>% # 累计每个参与者的正确回答次数 mutate(cum_correct = cumsum(accuracy), # 标记首次达到累计2次正确的行 is_target = cum_correct == 2 & !duplicated(cum_correct == 2)) %>% # 筛选目标行 filter(is_target) %>% # 计算各项指标 mutate(trial_count = row_number(), error_count = trial_count - cum_correct, time_elapsed = timestamp - first(timestamp)) %>% # 保留需要的列 select(id, trial_count, error_count, time_elapsed) %>% ungroup() # 输出结果 print(result)
代码说明
cum_correct = cumsum(accuracy):按参与者累计每次交互的正确次数is_target = cum_correct == 2 & !duplicated(...):确保只选取第一次累计到2次正确的试验行,排除后续重复满足条件的行trial_count = row_number():分组内的行号即为当前试验的次数error_count = trial_count - cum_correct:总试验数减去累计正确数,得到条件达成前的错误次数time_elapsed = timestamp - first(timestamp):计算从该参与者第一次试验到目标试验的耗时
执行结果
运行代码后会得到包含以下字段的结果:
id:参与者IDtrial_count:达到两次正确回答时的试验次数error_count:条件达成前的错误交互次数time_elapsed:条件达成前的耗时
内容的提问来源于stack exchange,提问作者caeco
相关产品推荐
相关产品推荐

