R使用Tidyverse如何选取每组的Start行与最后一个End行?
实现方案
核心逻辑为按Group分组后,同时匹配「State为Start」和「State为End且为分组内最后一个End」两个条件筛选行,适配任意规模数据。
完整运行代码
# 加载tidyverse library(tidyverse) # 构造示例数据 df <- tibble( Group = c(1,1,1,2,2,2,2), State = c("Start", "End", "End", "Start", "End", "End", "End"), Serial = 1:7 ) # 核心处理代码 result <- df %>% group_by(Group) %>% filter( State == "Start" | (State == "End" & Serial == max(Serial[State == "End"])) ) %>% ungroup()
运行后result即为你需要的目标数据框。
特殊场景适配
如果你的数据中Serial列不保证随End状态递增,需要按数据的原始行顺序取最后一个End,可以使用下方不依赖Serial的实现:
result <- df %>% group_by(Group) %>% mutate(row_order = row_number()) %>% filter( State == "Start" | (State == "End" & row_order == max(row_order[State == "End"])) ) %>% select(-row_order) %>% ungroup()
内容的提问来源于stack exchange,提问作者jeremyPJD
相关产品推荐
相关产品推荐

