R语言按id分组筛选出现连续两个yes后所有行的实现问题
R实现按id分组保留首次连续两个yes之后的所有记录
需求说明
对按id分组的数据集进行过滤,仅保留每个id分组中第一次观测到连续两个"yes"值之后的所有记录(包含这两个连续yes本身)。
示例构造数据
DT<-data.frame(id=c(1,1,1,2,2,2,2,3,3,3,3,3,3,3), type=c("yes","yes","no","no","yes","yes","no","no","yes","no","yes","yes","no","yes"))
预期输出结果
id type 1 yes 1 yes 1 no 2 yes 2 yes 2 no 3 yes 3 yes 3 no 3 yes
正确实现代码(dplyr)
library(dplyr) DT %>% group_by(id) %>% # 标记当前行和上一行是否为连续yes mutate(consec_yes = type == "yes" & lag(type, default = "") == "yes", # 计算首次连续yes对应的保留起始行号 start_row = which(consec_yes)[1] - 1) %>% # 过滤无连续yes的分组,保留起始行及之后的所有记录 filter(!is.na(start_row), row_number() >= start_row) %>% # 清理辅助列输出结果 select(id, type) %>% ungroup()
逻辑说明
- 按id分组后每个组独立计算规则
lag(type, default = "")取当前行的上一行type值,避免首行出现NA导致判断错误- 首次出现
consec_yes=TRUE的行是连续两个yes的第二行,往前推1行就是连续两个yes的第一行,作为保留记录的起始位置 - 过滤掉不存在连续yes的分组,仅保留每个组起始位置及之后的所有行即可得到目标结果
内容的提问来源于stack exchange,提问作者Yebelay Berehan
相关产品推荐
相关产品推荐

