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

如何在R语言中按Name分组后筛选每组首个ID对应的所有行?

R语言多条件筛选:按姓名提取首个ID对应的所有行

初始数据集

df <- data.frame(
  Name = c("Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Beth", "Beth", "Clark"),
  ID = c(1, 1, 2, 2, 3, 3, 3, 4, 4, 5),
  Month = c(4, 7, 4, 6, 7, 8, 8, 1, 1, 6),
  Day = c(5, 5, 5, 5, 8, 9, 9, 2, 2, 7),
  Grade = c("Pass", "Fail", "Pass", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", "Pass")
)

需求说明

针对每个唯一的Name,提取其对应的第一个ID,然后筛选出该Name与ID组合对应的所有行。预期输出如下:

Name   ID  Month  Day  Grade
Alex   1   4      5    Pass
Alex   1   7      5    Fail
Beth   4   1      2    Pass
Beth   4   1      2    Fail
Clark  5   6      7    Pass

问题代码分析

你尝试的代码存在逻辑错误:

df2 <- df %>% 
  group_by(Name) %>%
  group_modify(~ head(.x,1L)) %>%
  pull(Name,ID)

df3 <- df %>%
  filter(Name %in% df2, ID %in% df2)
  • pull(Name,ID)返回的是命名向量,向量值为Name,名字为ID。
  • filter(Name %in% df2, ID %in% df2)是分别检查Name是否在向量值中、ID是否在向量名字中,并非同时匹配Name与ID的组合,因此无法得到正确结果。

解决方案

方法一:简洁版(直接分组筛选)

利用dplyr分组功能,直接判断每行ID是否为当前Name组的第一个ID:

library(dplyr)

result <- df %>%
  group_by(Name) %>%
  filter(ID == first(ID)) %>%
  ungroup()

方法二:先提取匹配组合再关联

先提取每个Name对应的首个ID组合,再通过内连接筛选目标行:

# 提取每个Name的首个ID组合
first_id_pairs <- df %>%
  group_by(Name) %>%
  slice_head(n = 1) %>%
  select(Name, ID)

# 筛选匹配组合的行
result <- df %>%
  inner_join(first_id_pairs, by = c("Name", "ID"))

验证结果

运行上述代码后,result将与预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:18