按ID分组筛选数据集:保留满足条件的行及指定后续行
R语言按ID分组筛选行的解决方案
需求说明
按ID分组后,保留满足以下任一条件的行:
- 该行
Condition1列的值为1 - 该行
Condition2列的值为1,且紧邻在Condition1列值为1的行下方
数据集
df <- read.table(textConnection("ID Condition1 Condition2 A 1 0 A 1 1 A 0 1 A 1 0 A 0 0 A 0 1 B 1 1 B 0 1 C 1 0 C 0 0 D 1 0 D 0 1 D 1 1 D 0 0 "), header=TRUE)
解决方案代码
使用dplyr包完成分组筛选操作:
library(dplyr) filtered_df <- df %>% group_by(ID) %>% mutate(prev_condition1 = lag(Condition1, default = 0)) %>% filter(Condition1 == 1 | (Condition2 == 1 & prev_condition1 == 1)) %>% select(-prev_condition1) %>% ungroup() # 查看筛选结果 print(filtered_df)
代码逻辑解释
- 分组处理:通过
group_by(ID)保证每个ID内部独立处理行的顺序与条件 - 生成辅助列:
lag(Condition1, default = 0)获取当前行的上一行Condition1值,第一行无前置行,默认设为0 - 筛选规则:
- 直接保留
Condition1 == 1的行 - 保留
Condition2 == 1且上一行Condition1 == 1的行
- 直接保留
- 清理数据:移除辅助列
prev_condition1,并取消分组状态
输出结果
运行代码后得到的结果与预期一致:
| ID | Condition1 | Condition2 |
|---|---|---|
| A | 1 | 0 |
| A | 1 | 1 |
| A | 0 | 1 |
| A | 1 | 0 |
| B | 1 | 1 |
| B | 0 | 1 |
| C | 1 | 0 |
| D | 1 | 0 |
| D | 0 | 1 |
| D | 1 | 1 |
内容的提问来源于stack exchange,提问作者JeffWithpetersen
相关产品推荐
相关产品推荐

