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

R语言按指定列唯一值对数据集分组并分配唯一组ID

R语言按指定多列属性组合分组并分配唯一组ID实现方案

你这个需求属于精确属性匹配分组,不属于常规基于距离计算的无监督聚类,不需要做标准化、距离度量这类复杂操作,核心逻辑是识别指定5个字段的唯一值组合,给每组分配固定ID即可,入门门槛很低,下面给两种可直接运行的实现方案。

方案1:Base R原生实现(无需安装第三方包)

不需要额外装任何包,兼容性最好,ID顺序严格按照属性组合在数据集中第一次出现的顺序生成,不会自动排序打乱顺序。

# 按要求顺序指定分组依据列
group_cols <- c("Product.group", "Performance", "Family", "Function", "Voltage")

# 生成唯一组ID
Data.df$group_id <- as.integer(
  factor(
    # 用特殊分隔符拼接多列值,避免单分隔符导致的组合键冲突
    do.call(paste, c(Data.df[group_cols], sep = "_||_")),
    # 锁定组合顺序,按数据中首次出现的顺序编号
    levels = unique(do.call(paste, c(Data.df[group_cols], sep = "_||_")))
  )
)

# 如果需要把每个分组拆成独立的子集数据框,直接运行这行即可
group_list <- split(Data.df, f = Data.df$group_id)

说明:这里选_||_当拼接分隔符,是为了避免列值本身含下划线时,不同属性组合被误判为同一个——比如某行Product.group值为"a_b"、Performance为"c",另一行Product.group为"a"、Performance为"b_c",如果用单下划线拼接,两个组合的拼接结果会完全一致导致分组错误,用特殊多字符分隔符可以完全规避这个问题。

方案2:dplyr实现(代码可读性更高,适合日常数据处理)

如果你平时用tidyverse生态做数据处理,dplyr的语法更简洁易读,逻辑和原生方案完全一致:

# 没装包的话先运行 install.packages("dplyr")
library(dplyr)

# 生成组ID
Data.df <- Data.df %>%
  group_by(across(all_of(group_cols))) %>%
  mutate(group_id = cur_group_id()) %>%
  ungroup()

# 拆分为独立子集列表
group_list <- Data.df %>%
  group_by(group_id) %>%
  group_split()

分组结果校验(新手必做)

为了避免列名写错、分隔符冲突导致的分组错误,跑完代码后可以用下面的语句校验,返回TRUE就说明分组完全正确:

check_pass <- Data.df %>%
  group_by(group_id) %>%
  # 统计每个组ID下对应多少种不同的属性组合
  summarise(comb_n = n_distinct(across(all_of(group_cols))), .groups = "drop") %>%
  # 所有组都只有1种组合即为校验通过
  pull(comb_n) %>%
  all(. == 1)

print(check_pass)

注意事项

  • 不要把这个分组逻辑和K-means、层次聚类这类无监督聚类混淆:后者是基于样本距离做的“模糊”分簇,你现在的需求是按指定属性做精确匹配分组,逻辑要简单得多
  • 如果指定的5个列里存在缺失值NA,上述代码会默认把NA取值一致的行归为同一组,如果需要排除带缺失值的记录,分组前先运行Data.df <- na.omit(Data.df, cols = all_of(group_cols))过滤即可
  • 最终生成的group_id是从1开始的连续整数,后续做分组统计、分簇下钻分析都可以直接用这个字段当分组标识

内容的提问来源于stack exchange,提问作者Arvind Menon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:03:20