You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:48:04