是否有R函数判断组值完全相同?及分组报错处理
如何用R识别具有完全相同B值集合的A组并统一分组ID
你需要实现的是:识别出所有B值集合完全相同的A组,并为它们分配同一个Group ID,而非按单个B值分组。
现有数据
| A | B |
|---|---|
| 1 | a |
| 2 | c |
| 2 | e |
| 3 | f |
| 4 | h |
| 5 | c |
| 5 | e |
期望结果
| A | B | Group |
|---|---|---|
| 1 | a | 1 |
| 2 | c | 2 |
| 2 | e | 2 |
| 3 | f | 3 |
| 4 | h | 4 |
| 5 | c | 2 |
| 5 | e | 2 |
尝试的代码
library(readxl) library(dplyr) library(stringr) data1 <- read_excel("testing.xlsx") data2 <- data1 %>% group_by(A) %>% group_by(B) %>% mutate(Group = cur_group_id()) %>% ungroup()
运行结果
| A | B | Group |
|---|---|---|
| 1 | a | 1 |
| 2 | c | 2 |
| 2 | e | 3 |
| 3 | f | 4 |
| 4 | h | 5 |
| 5 | c | 2 |
| 5 | e | 3 |
补充问题
尝试评论中的方法时出现报错:Can’t supply ‘.by’ when ‘.data’ is a grouped data frame.,原始数据经过left-join后已被分组,该如何处理?
解决方案
核心思路
先按A分组,将每个A对应的所有B值整理成标准化标识(如排序后拼接成字符串),再根据这个标识分配统一的Group ID。
代码实现
处理未分组数据
library(dplyr) data_result <- data1 %>% # 按A分组,将B值排序后拼接为统一标识 group_by(A) %>% mutate(group_key = paste(sort(B), collapse = ",")) %>% ungroup() %>% # 根据标识分配连续的Group ID mutate(Group = as.integer(factor(group_key, levels = unique(group_key)))) %>% # 移除临时标识列(可选) select(-group_key)
处理已分组数据(解决报错)
若数据已处于分组状态,需先取消分组再执行逻辑:
# 假设data_grouped是left-join后的分组数据 data_result <- data_grouped %>% # 先取消所有分组 ungroup() %>% group_by(A) %>% mutate(group_key = paste(sort(B), collapse = ",")) %>% ungroup() %>% mutate(Group = as.integer(factor(group_key, levels = unique(group_key)))) %>% select(-group_key)
代码解释
group_by(A):按A列分组,处理每个A对应的B值集合paste(sort(B), collapse = ","):将B值排序后拼接成字符串,确保集合相同的A组得到一致标识(如A=2和A=5的B值排序后均为"c,e")factor(group_key)+as.integer():将标识转换为连续的Group IDungroup():针对已分组数据,必须先取消分组才能执行后续逻辑,解决Can’t supply ‘.by’ when ‘.data’ is a grouped data frame报错
内容的提问来源于stack exchange,提问作者user15290979
相关产品推荐
相关产品推荐

