使用dplyr基于另一数据表提取满足全部指定颜色的车辆数据
解决方法:筛选覆盖全部指定颜色的品牌的所有行
你之前用的filter(COLOR %in% table2$COLOR)确实只能拿到至少包含一个目标颜色的行,但我们需要的是整个品牌拥有table2里所有指定颜色的所有行——哪怕某一行的颜色不在目标集合里,只要它所属的品牌覆盖了全部目标颜色,就应该被保留。
下面是用dplyr实现的完整步骤:
步骤1:明确目标颜色集合
首先从table2中提取所有需要的颜色(去重,避免重复值干扰):
target_colors <- unique(table2$COLOR) # 这里得到的是 c("BLACK", "RED", "BLUE", "PURPLE")
步骤2:筛选符合条件的品牌
我们需要找出那些颜色集合包含所有target_colors的品牌:
library(dplyr) qualified_makes <- table1 %>% group_by(MAKE) %>% # 检查当前品牌的所有颜色是否覆盖了全部目标颜色 summarise(has_all_colors = all(target_colors %in% COLOR), .groups = "drop") %>% # 只保留符合条件的品牌 filter(has_all_colors) %>% # 提取品牌名称作为筛选器 pull(MAKE)
步骤3:提取符合条件品牌的所有行
用上面得到的品牌列表,过滤table1的所有行:
result <- table1 %>% filter(MAKE %in% qualified_makes)
运行后得到的结果就是你想要的:
YEAR MODEL MAKE ORDERCODE COLOR 1 2001 GS300h LEXUS YUK BLACK 2 2001 GS300h LEXUS HNY BLUE 3 2002 GS300h LEXUS ASF PURPLE 4 2002 GS300h LEXUS FAS BROWN 5 2002 GS300h LEXUS YUI RED
为什么这个方法可行?
all(target_colors %in% COLOR)会检查目标颜色的每一个值,是否都存在于当前品牌的颜色集合中,只有全部满足时,该品牌才会被选中。- 最后筛选的是品牌而非颜色,所以即使某行的颜色不在目标集合里(比如例子中的BROWN),只要它所属的品牌符合条件,就会被保留下来。
内容的提问来源于stack exchange,提问作者Sheila
相关产品推荐
相关产品推荐

