如何使用dplyr基于另一数据框按分组匹配规则过滤数据框
实现方案
你这个需求本质是按comp_name分组后,判断每个记录的model值是否落在对应组的目标值集合里,两种常用tidyverse写法都能实现:
方法1:拆分嵌套列后做内连接(推荐,性能更好)
wanted_model_dat里的wanted_model是列表型列,先把嵌套的向量拆成独立行,再和原数据做键值匹配的内连接即可,逻辑直白不容易出边界问题:
library(tidyverse) res <- wanted_model_dat %>% # 把列表列里的向量拆成逐行的单个值 unnest_longer(wanted_model) %>% # 按comp_name+模型值匹配,只保留两边都存在的记录 inner_join(dat, by = c("comp_name", "wanted_model" = "model")) %>% # 调整列名和列顺序和预期结果对齐 select(comp_name, model = wanted_model, status)
运行后得到的结果和你给出的预期输出完全一致:
# A tibble: 3 × 3 comp_name model status <chr> <dbl> <chr> 1 foo 2 B 2 foo 11 C 3 bar 0 X
方法2:行式判断筛选
如果不想拆分匹配表,也可以连接后逐行判断model是否在对应组的目标向量里:
res2 <- dat %>% left_join(wanted_model_dat, by = "comp_name") %>% # 逐行判断model是否属于当前行的wanted_model向量 filter(map2_lgl(model, wanted_model, ~ .x %in% .y)) %>% select(-wanted_model)
两种写法输出结果完全相同,数据量较大时优先选第一种拆表连接的写法,运行效率更高。
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

