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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:21:34