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

基于多字符串变量的dplyr重复行条件过滤问题求助

这种多规则优先级的去重确实容易踩坑,尤其是当不同变量的判断逻辑嵌套在一起时。我来帮你用dplyr实现完全符合你需求的方案,咱们就从你的模拟数据入手。

首先明确你要遵循的优先级规则,我再梳理一遍确保没理解错:

  • 规则1:仅出现一次的人员记录直接保留,不管其他属性;
  • 规则2:同一人有多条记录时,优先留**有车(car=1)**的;
  • 规则3:都是有车的情况下,优先留**有保险(insurance="yes")**的;
  • 规则4:都有保险的情况下,优先留**全额险(ins_type="full")**的。

核心思路是给每个记录按规则定义优先级顺序,分组后取每组优先级最高的第一条记录。这里用有序因子来定义各变量的优先级层级,非常直观且容易调整:

library(dplyr)

# 你的模拟数据
id = c(1, 1, 2, 2, 5, 6, 6)
car = c(0, 1, 1, 1, 1, 1, 1)
insurance = c("no", "yes", "yes", "yes", "no", "yes", "yes")
ins_type = c("", "liab", "liab", "full", "", "full", "liab")
df = data.frame(id, car, insurance, ins_type)

# 按优先级去重
df_clean <- df %>%
  group_by(id) %>%
  # 严格按照你的优先级规则排序:
  # 1. 有车在前(car降序);2. 有保险在前;3. 全额险在前
  arrange(
    desc(car),
    factor(insurance, levels = c("no", "yes"), ordered = TRUE) %>% desc(),
    factor(ins_type, levels = c("", "liab", "full"), ordered = TRUE) %>% desc()
  ) %>%
  # 每组只保留优先级最高的第一条记录
  slice(1) %>%
  ungroup()

# 查看结果
df_clean

运行这段代码后,你会得到符合预期的结果:

# A tibble: 4 × 4
     id   car insurance ins_type
  <dbl> <dbl> <chr>     <chr>   
1     1     1 yes       liab    
2     2     1 yes       full    
3     5     1 no        ""      
4     6     1 yes       full    

咱们来对应规则验证下:

  • id=1:两条记录里选了有车且有保险的那条(符合规则2、3);
  • id=2:两条都是有车有保险,选了全额险的(符合规则4);
  • id=5:只有一条记录,直接保留(符合规则1);
  • id=6:两条都是有车有保险,选了全额险的(符合规则4)。

这个方法的优势在于,每个变量的优先级通过因子层级明确定义,后续如果需要调整规则(比如改保险优先级或者新增判断维度),只需要修改factor()里的levels顺序就行,非常灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:18:53