如何用R的tibble、group_by和slice复现SAS分组取首尾行逻辑
使用R实现SAS的连续治疗组首尾行提取逻辑
假设你的R数据框名为df,包含usubjid(患者ID)和trt(治疗组)等字段,可通过以下步骤实现目标:
生成连续治疗组的分组标识
先为同一患者内的连续相同trt生成唯一分组ID,用dplyr原生方法即可实现:library(tibble) library(dplyr) df_processed <- df %>% as_tibble() %>% group_by(usubjid) %>% # 当当前行trt与上一行不同时,分组标识计数+1 mutate(trt_group = cumsum(trt != lag(trt, default = first(trt)))) %>% ungroup()按患者+连续治疗组分组,提取首尾行
基于生成的分组标识,用slice提取每组的首行和末行:result <- df_processed %>% group_by(usubjid, trt_group) %>% slice(c(1, n())) %>% ungroup() %>% # 可选:移除临时分组标识列 select(-trt_group)
补充说明
lag(trt, default = first(trt))用于匹配当前行的上一行trt值,第一行默认使用自身trt,确保第一个连续组的标识计数从0开始。- 若某连续治疗组仅含1行,
slice(c(1, n()))会重复选中该行,如需去重可追加distinct()。
内容的提问来源于stack exchange,提问作者crow16384
相关产品推荐
相关产品推荐

