R语言按参与者分组累加正确试次遇0重置的实现问题
实现方案
使用dplyr两层分组即可实现需求,核心逻辑是先为每个参与者生成遇0递增的分段标记,再在每个分段内做累加计算:
library(dplyr) df <- df %>% # 第一层分组:按参与者分组 group_by(Participant) %>% # 生成分段标记:每遇到1次Correct=0,分段号+1 mutate(segment = cumsum(Correct == 0)) %>% # 第二层分组:按参与者+分段号分组 group_by(Participant, segment) %>% # 同分段内累加Correct值,自然实现遇0重置 mutate(Count = cumsum(Correct)) %>% # 清理临时列,转回普通数据框 ungroup() %>% select(-segment) %>% as.data.frame()
输出结果验证
运行后得到的Count列完全符合需求:
| Participant | TrialNumber | Correct | Count |
|---|---|---|---|
| 118 | 1 | 1 | 1 |
| 118 | 2 | 1 | 2 |
| 118 | 3 | 1 | 3 |
| 118 | 4 | 1 | 4 |
| 118 | 5 | 1 | 5 |
| 118 | 6 | 1 | 6 |
| 118 | 7 | 1 | 7 |
| 118 | 8 | 0 | 0 |
| 118 | 9 | 1 | 1 |
| 118 | 10 | 1 | 2 |
| 120 | 1 | 1 | 1 |
| 120 | 2 | 1 | 2 |
| 120 | 3 | 1 | 3 |
| 120 | 4 | 1 | 4 |
| 120 | 5 | 0 | 0 |
| 120 | 6 | 1 | 1 |
| 120 | 7 | 0 | 0 |
| 120 | 8 | 1 | 1 |
| 120 | 9 | 1 | 2 |
| 120 | 10 | 1 | 3 |
如果不需要保留Correct=0行的Count为0,而是希望0行留空、从0之后的第一个1重新从1计数,只需要在生成Count时加判断即可:mutate(Count = ifelse(Correct == 0, NA, cumsum(Correct)))
内容的提问来源于stack exchange,提问作者r.rodrigues18
相关产品推荐
相关产品推荐

