R语言按ID分组保留Accept_Medicare为Opt-Out的行问题求助
解决按ID去重并保留指定Accept_Medicare值行的问题
问题分析
你的代码存在两个核心问题:
- 使用
summarise结合first(.x)会取每个ID分组的第一行,而非筛选出Accept_Medicare为"Opt-Out"的行; - 数据中存在大小写不一致("Opt-out"和"Opt-Out"),导致匹配判断失效。
解决方案
由于你明确每个ID仅有一行Accept_Medicare为"Opt-Out"(含大小写变体),可以直接筛选目标行,同时处理大小写问题避免匹配错误:
方法1:直接筛选(推荐)
library(dplyr) library(stringr) # 用于处理大小写转换 # 构造示例数据 ID <- c("01", "01", "02", "02") Accept_Medicare <- c("Opt-out", "Accept", "Opt-Out", "Accept") Data <- c("yes", "no", "no", "no") combo1 <- data.frame(ID, Accept_Medicare, Data) # 筛选并去重 combo1_clean <- combo1 %>% # 统一转换为小写,避免大小写不匹配 mutate(Accept_Medicare = str_to_lower(Accept_Medicare)) %>% # 筛选目标行 filter(Accept_Medicare == "opt-out")
运行后结果:
ID Accept_Medicare Data 1 01 opt-out yes 2 02 opt-out no
方法2:分组后筛选(适用于需要保留分组逻辑的场景)
如果需要确保每个ID只保留一行(即使存在多目标行的极端情况),可以分组后筛选:
combo1_clean <- combo1 %>% group_by(ID) %>% filter(str_to_lower(Accept_Medicare) == "opt-out") %>% ungroup()
原代码问题修正说明
如果你想基于原代码调整,需要替换first(.x)为筛选后的取值,同时修正大小写匹配:
combo1_clean <- combo1 %>% group_by(ID) %>% summarise( Accept_Medicare = first(Accept_Medicare[str_to_lower(Accept_Medicare) == "opt-out"]), Data = first(Data[str_to_lower(Accept_Medicare) == "opt-out"]) )
但这种方式不如直接筛选简洁。
内容的提问来源于stack exchange,提问作者benzinga
相关产品推荐
相关产品推荐

