R语言dplyr实现:分组单条记录时复制行并标注前后测时间
dplyr实现pre-post前后测缺失后测数据补全方案
问题场景
现有R环境存储的pre-post前后测数据集,部分按episode字段划分的分组仅存在前测观测值,初始示例数据构造代码:
episode <- c('1','1','2','3','3') score <- c('44','12','37','40','9') df <- data.frame(episode,score)
处理要求:
- 优先使用dplyr包实现
- 所有仅含1条记录的
episode分组,复制该条唯一记录补全为2条 - 新增
time字段,标记每条记录为前测(值为1)/后测(值为2) - 最终输出结构匹配如下预期:
| episode | score | time |
|---|---|---|
| 1 | 44 | 1 |
| 1 | 12 | 2 |
| 2 | 37 | 1 |
| 2 | 37 | 2 |
| 3 | 40 | 1 |
| 3 | 9 | 2 |
实现代码
核心逻辑为按episode分组后,对单记录组重复取首行补全为2行,再按组内行顺序生成time标记,代码简洁易读:
library(dplyr) result <- df %>% group_by(episode) %>% # 单条记录的分组重复取第1行凑2条,已有2条的分组保留原有两行顺序 slice(c(1, if(n() == 1) 1 else 2)) %>% # 按组内行顺序生成time字段 mutate(time = row_number()) %>% ungroup()
如果偏好更易读的分支写法,也可以使用group_modify版本,逻辑完全一致:
result <- df %>% group_by(episode) %>% group_modify(~ { # 单条记录则复制一行 if(nrow(.x) == 1) .x <- .x[rep(1, 2), ] .x }) %>% mutate(time = row_number()) %>% ungroup()
运行代码后得到的结果完全匹配预期结构:原本就有2条记录的分组会按原始顺序标记前测、后测;仅存前测的分组复制原记录补全后测,score值与原前测记录保持一致。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

