You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:40:11