如何使用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
相关产品推荐
相关产品推荐

