R语言如何筛选分组内两个Condition为True的行之间的所有记录
R 数据表筛选解决方案
前置说明
我们需要按ID分组,提取每个分组内第一、第二个Condition为T的行之间的所有记录(包含两端T行),以下分别提供dplyr和base R两种实现方式。
1. 示例数据构造
先构造你给出的测试数据表:
df <- data.frame( ID = rep(c(1,2), each = 6), Days = c(1,2,4,10,11,12,1,2,14,20,24,30), Condition = c("F","F","T","F","F","T","F","F","T","F","T","F") )
2. dplyr 实现
核心逻辑是按ID分组后,定位分组内两个T的行位置,筛选位置区间内的所有行:
library(dplyr) res_dplyr <- df %>% # 按ID分组 group_by(ID) %>% # 筛选第一个T到第二个T之间的行 filter(between(row_number(), which(Condition == "T")[1], which(Condition == "T")[2])) %>% # 取消分组 ungroup()
运行后输出结果和你给出的预期完全一致。
3. base R 实现
通过拆分分组、逐个处理再合并的方式实现:
# 按ID拆分数据 df_split <- split(df, df$ID) # 逐个处理每个分组 res_base <- do.call(rbind, lapply(df_split, function(sub) { t_pos <- which(sub$Condition == "T") # 取两个T之间的行 sub[t_pos[1]:t_pos[2], ] })) # 重置行号 rownames(res_base) <- NULL
补充说明
如果你的实际数据中存在某个ID的T的数量不足2个的情况,可以在筛选前增加判断逻辑,比如只处理T数量≥2的分组,避免索引报错。
内容的提问来源于stack exchange,提问作者Robin Philip
相关产品推荐
相关产品推荐

