基于多字符串变量的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
相关产品推荐
相关产品推荐

