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

