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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:10:32