如何用dplyr基于组内全部值关联两个数据框?
按分组全匹配关联数据框的解决方案
需求说明
需要实现:当xData中某一id对应的所有value集合,与yData中某一grouping_value对应的所有value集合完全一致时,将该grouping_value赋值给该id的所有行,最终得到目标结果exptdOutcome。
示例数据
library(tidyverse) xData <- tibble( id = rep(c(1:3), each = 3), value = c("A", "B", "C", "A", "D", "E", "A", "B", "C"), ) yData <- tibble( value = c("A", "B", "C", "A", "D", "E"), grouping_value = rep(c("a","b"), each = 3), ) # 预期输出 exptdOutcome <- xData %>% mutate(grouping_value = rep(c("a","b","a"), each = 3))
解决方案代码
# 1. 预处理yData:提取每个grouping_value对应的有序value集合 y_group_sets <- yData %>% group_by(grouping_value) %>% summarise(value_set = list(sort(value))) %>% ungroup() # 2. 匹配xData的id分组与yData的grouping_value分组 final_result <- xData %>% group_by(id) %>% mutate(value_set = list(sort(value))) %>% left_join(y_group_sets, by = "value_set") %>% select(-value_set) %>% ungroup() # 验证结果与预期一致 all.equal(final_result, exptdOutcome)
逻辑解释
- 对
yData按grouping_value分组后,将每组的value排序并转为列表:排序是为了消除value顺序对集合匹配的影响(比如A,B,C和C,B,A属于同一集合) - 对
xData按id分组,生成每组有序的value集合列表 - 通过
value_set列表列进行连接,自动匹配到每个id对应的grouping_value - 最后移除辅助列
value_set,得到符合要求的结果
内容的提问来源于stack exchange,提问作者Rich.a.rd
相关产品推荐
相关产品推荐

