R中实现指定文本列变化时将Time列重置为0/1重新计数
R中按Trial列分组重置Time列递增计数的实现
针对27万行规模、Trial列取值无回溯、累计切换395次的数据集,直接按Trial列分组生成连续序列即可,不需要做复杂的相邻值判断,所有方案都能秒级跑完。
- 方案1:data.table实现(性能最优,推荐大数据量使用)
library(data.table) setDT(df) # 从1开始递增,需要从0开始就替换为 seq_len(.N) - 1 df[, Time := seq_len(.N), by = Trial]
- 方案2:dplyr实现(适配tidyverse工作流)
library(dplyr) df <- df %>% group_by(Trial) %>% # 从1开始递增,需要从0开始就替换为 row_number() - 1 mutate(Time = row_number()) %>% ungroup()
- 方案3:基础R实现(无第三方包依赖)
# 从1开始递增,需要从0开始就在结果后减1 df$Time <- ave(rep(1L, nrow(df)), df$Trial, FUN = cumsum)
以上方案用提供的示例数据运行,输出完全匹配预期结果:
| Time | Trial |
|---|---|
| 1 | A |
| 2 | A |
| 1 | B |
| 2 | B |
备用适配:如果后续遇到Trial取值回溯出现的场景,不能直接按Trial值分组,需要先识别相邻行的Trial变化点生成分组ID再计数,dplyr写法示例:
df <- df %>% mutate(.group_id = cumsum(Trial != lag(Trial, default = first(Trial)))) %>% group_by(.group_id) %>% mutate(Time = row_number()) %>% ungroup() %>% select(-.group_id)
内容的提问来源于stack exchange,提问作者Dylan Egan
相关产品推荐
相关产品推荐

