如何用R代码判断不同A分组的B值集合一致并合并分组?
按A分组的B值集合匹配分配Group
原始数据
| A | B |
|---|---|
| 1 | a |
| 2 | c |
| 2 | e |
| 3 | f |
| 4 | h |
| 5 | c |
| 5 | e |
需求
若不同A分组下的所有B值完全匹配(集合一致,不考虑顺序),则将这些A分组归为同一Group。例如A=2和A=5的B值均为c、e,应归为同一Group,期望结果如下:
| A | B | Group |
|---|---|---|
| 1 | a | 1 |
| 2 | c | 2 |
| 2 | e | 2 |
| 3 | f | 3 |
| 4 | h | 4 |
| 5 | c | 2 |
| 5 | e | 2 |
现有代码问题
你尝试的代码中,先按A分组后又按B分组,导致cur_group_id()是基于单个B值生成的,而非A对应的B值集合,所以结果不符合预期。
正确实现代码
library(readxl) library(dplyr) library(stringr) # 读取原始数据 data1 <- read_excel("testing.xlsx") # 生成A与Group的映射关系 group_mapping <- data1 %>% group_by(A) %>% # 将B值排序后拼接成字符串,消除顺序对集合匹配的影响 summarise(b_set = str_c(sort(B), collapse = ","), .groups = "drop") %>% # 根据B值集合分配唯一Group ID mutate(Group = cur_group_id()) # 将Group关联回原始数据 data2 <- data1 %>% left_join(group_mapping, by = "A")
代码说明
- 先按A分组,对每个A对应的B值排序后拼接成字符串,这样只要B值集合相同,拼接后的字符串就一致,不受B值顺序影响。
- 对唯一的B值集合分配Group ID,确保相同集合的A对应同一个Group。
- 通过
left_join将Group信息关联回原始数据,得到符合需求的结果。
内容的提问来源于stack exchange,提问作者user15290979
相关产品推荐
相关产品推荐

