在Stata或R中按id分组保留dummy连续≥3的1的观测
按ID保留连续≥3次的dummy=1观测(Stata实现)
原始数据集
以下是R格式的原始数据结构:
structure(list(id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4), month = c(1, 2, 3, 4, 5, 6, 3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), dummy = c(1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -29L))
需求规则
- 按
id分组处理 - 仅保留
dummy取值为1且连续出现次数≥3的观测 - 若某分组内存在连续2个1后跟1个0,这3行全部删除;最终只保留连续长度≥3的1对应的行
- Stata实现禁止使用外部程序或包
Stata代码实现
* 按id和month排序,确保数据按时间顺序排列 sort id month * 按id分组,生成连续相同dummy值的组编号 by id: gen run = sum(dummy != dummy[_n-1]) * 修正第一个观测的组编号(_n-1=0时dummy[_n-1]缺失,手动设为1) replace run = 1 if _n == 1 * 按id和run分组,计算每个连续组的长度和该组的dummy值 by id run: gen run_len = _N by id run: gen run_dummy = dummy[1] * 保留符合条件的观测:dummy=1且连续长度≥3 keep if run_dummy == 1 & run_len >= 3 * 删除中间生成的辅助变量 drop run run_len run_dummy
处理后结果说明
处理后保留的观测如下:
- id=2:month3-5的3行连续1,全部保留
- id=3:month13-17的5行连续1,保留;month10-11的2行连续1被删除
- id=4:month5-7的3行连续1、month10-13的4行连续1,保留;month2-3的2行连续1被删除
- id=1:仅1个孤立的1,被删除
内容的提问来源于stack exchange,提问作者R novice
相关产品推荐
相关产品推荐

