如何在DataFrame中生成不依赖列顺序的唯一合并标识列?
如何在R的DataFrame中生成不依赖列顺序的分组唯一标识?
需求是给DataFrame新增一列type,使得任意两行的x和y元素集合相同(不考虑顺序)时,type值一致(比如(1,2)和(2,1)对应同一个type)。以下是几种可行的实现方法:
方法1:基于排序后的字符串分组(dplyr)
先对每行的x和y进行排序,拼接成统一格式的字符串作为分组键,再生成组ID:
library(tibble) library(dplyr) df = tibble(x = c(1,2,3,3,4,10,9), y=c(2,1,9,9,9,1,3)) df |> rowwise() |> # 对每行的x、y排序后拼接成字符串 mutate(group_key = paste(sort(c(x, y)), collapse = "-")) |> ungroup() |> group_by(group_key) |> mutate(type = cur_group_id()) |> # 移除中间生成的分组键 select(-group_key)
方法2:基于排序后的向量分组(更严谨,dplyr)
如果x或y包含特殊字符(比如分隔符-),用字符串拼接可能出错,此时可以用列表存储排序后的向量作为分组键:
df |> rowwise() |> mutate(group_key = list(sort(c(x, y)))) |> ungroup() |> group_by(group_key) |> mutate(type = cur_group_id()) |> select(-group_key)
方法3:基于极值分组(data.table,高效适合大数据)
用pmin和pmax直接提取每行的最小、最大值作为分组依据,无需排序整个向量,效率更高:
library(data.table) setDT(df) df[, type := .GRP, by = .(pmin(x, y), pmax(x, y))]
结果验证
以上方法都会生成符合预期的输出:
# A tibble: 7 × 3 x y type <dbl> <dbl> <int> 1 1 2 1 2 2 1 1 3 3 9 2 4 3 9 2 5 4 9 3 6 10 1 4 7 9 3 2
原方法错误原因
直接使用group_by(x,y)结合cur_group_id()时,分组是严格按照x和y的顺序进行的,(1,2)和(2,1)会被识别为两个不同的分组,因此生成的type值不一致,不符合需求。
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

