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

如何使用dplyr按ID筛选Departure列最后一个FALSE及之后的行?

使用dplyr实现分组筛选:保留每个ID最后一个FALSE及之后的行

核心思路

按ID分组后,定位每个组内Departure列最后一个FALSE对应的行位置,再筛选出该位置及之后的所有行。

完整代码实现

library(dplyr)

# 构建原始数据集
ID <- rep(c("A","B"), times = c(3,4))
Departure <- c("TRUE","FALSE","TRUE","TRUE","FALSE","FALSE","TRUE")
Date <- c("Jan 1","Jan 2","Jan 3","Jan 1","Jan 2","Jan 3","Jan 4")
data <- data.frame(ID, Departure, Date)

# 转换Departure为逻辑型(可选,但更符合R数据规范)
data <- data %>% mutate(Departure = as.logical(Departure))

# 执行分组筛选
result <- data %>%
  group_by(ID) %>%
  # 计算每个组内最后一个FALSE的行号
  mutate(last_false_pos = max(which(!Departure), na.rm = TRUE)) %>%
  # 筛选出最后一个FALSE及之后的行
  filter(row_number() >= last_false_pos) %>%
  # 移除临时辅助列
  select(-last_false_pos) %>%
  # 取消分组
  ungroup()

# 查看结果
print(result)

代码解释

  • group_by(ID):按ID对数据分组,确保每个ID的筛选独立执行
  • mutate(last_false_pos = max(which(!Departure), na.rm = TRUE)):
    • which(!Departure)找出当前组内所有Departure为FALSE的行索引
    • max(...)取这些索引的最大值,即最后一个FALSE的位置
    • na.rm = TRUE用于兼容某些组没有FALSE的情况(避免报错)
  • filter(row_number() >= last_false_pos):保留行号大于等于最后一个FALSE位置的行
  • select(-last_false_pos):删除临时生成的辅助列,让结果更整洁
  • ungroup():取消分组,将结果转换为普通数据框

运行结果

# A tibble: 4 × 3
  ID    Departure Date 
  <chr> <lgl>     <chr>
1 A     FALSE     Jan 2
2 A     TRUE      Jan 3
3 B     FALSE     Jan 3
4 B     TRUE      Jan 4

内容的提问来源于stack exchange,提问作者Cam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:35