R语言如何筛选每个ID分组中首个var="y"的行及其前一行
R按分组保留首个"y"行及其前一行的实现方法
核心逻辑
按id字段分组后,先定位每个分组内var取值为"y"的第一行行号,筛选保留该行和它的上一行;如果分组内第一个元素就是"y"(不存在上一行)、或者分组内根本没有"y"值,直接跳过该分组不保留内容。
方法1:dplyr 实现(适合tidyverse工作流)
library(dplyr) # 构造示例测试数据 df <- data.frame( id = c(1,1,1,2,2,2,2,3,3,3), var = c("x","y","y","x","y","x","y","y","x","x") ) # 数据处理 res <- df %>% group_by(id) %>% mutate(first_y_idx = which(var == "y")[1]) %>% filter( row_number() %in% c(first_y_idx - 1, first_y_idx), first_y_idx > 1 # 排除首行就是y、没有前一行的分组 ) %>% select(-first_y_idx) %>% ungroup()
运行后得到的结果和预期完全一致:
# A tibble: 4 × 2 id var <dbl> <chr> 1 1 x 2 1 y 3 2 x 4 2 y
方法2:data.table 实现(适合大数据量场景,性能更高)
library(data.table) setDT(df) res <- df[, { first_y_idx <- which(var == "y")[1] # 仅当首个y存在且不在分组第一行时,提取对应两行 if (!is.na(first_y_idx) && first_y_idx > 1) { .SD[(first_y_idx - 1):first_y_idx] } }, by = id]
调整说明
如果业务场景需要保留首行就是"y"的分组(仅保留该首行y即可),只需要去掉代码里first_y_idx > 1的判断条件,调整取数索引范围适配需求就行。
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

