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

如何用R自动化识别序列中近似等值的聚类分组?

用R语言自动识别数值序列的聚类分组(组内数值差异≤20)

需求说明

现有数值序列V1,需自动划分聚类分组,要求组内任意数值之间的差异不超过20,替代手动标注的V2分组。以下提供三种实用的R实现方法:


先加载示例数据

df <- data.frame(
  V1 = c(399.710, 403.075, 405.766, 407.112, 408.458, 409.131, 410.477, 411.150, 412.495,
         332.419, 330.400, 329.054, 327.708, 326.363, 325.017, 322.998, 319.633, 314.923,
         288.680, 285.315, 283.969, 281.950, 279.932, 276.567, 273.875, 272.530, 271.857,
         272.530, 273.875, 274.548, 275.894, 275.894, 276.567, 277.240, 278.586, 279.932,
         281.950, 284.642, 288.007, 291.371, 294.063, 295.409, 296.754, 297.427, 298.100,
         299.446, 300.792, 303.484, 306.848, 327.708, 309.540, 310.213, 309.540, 306.848,
         304.156, 302.811, 302.811, 304.156, 305.502, 306.175, 306.175, 304.829),
  V2 = c(rep(1,9), rep(2,9), rep(3,22), rep(4,9), 5, rep(6,12))
)

方法1:动态顺序分组(保留原始数据顺序)

适合时序类数据,按数值出现的顺序动态判断分组:新值若能融入当前组(组内所有值差异≤20)则加入,否则新建组。

threshold <- 20
groups <- numeric(nrow(df))
current_group <- 1
groups[1] <- current_group
current_min <- df$V1[1]
current_max <- df$V1[1]

for(i in 2:nrow(df)){
  val <- df$V1[i]
  # 检查当前值是否在当前组的数值范围内(组内最大最小差值≤20)
  if(val >= current_min && val <= current_max + threshold || 
     val <= current_max && val >= current_min - threshold){
    groups[i] <- current_group
    current_min <- min(current_min, val)
    current_max <- max(current_max, val)
  } else {
    current_group <- current_group + 1
    groups[i] <- current_group
    current_min <- val
    current_max <- val
  }
}

# 新增自动分组列
df$auto_group1 <- groups

方法2:层次聚类(基于数值相似度,不考虑顺序)

通过计算数值间的欧氏距离,构建层次聚类树,再按距离阈值20切割得到分组。

# 计算距离矩阵
dist_matrix <- dist(df$V1, method = "euclidean")
# 构建层次聚类树(完全连接法)
hc <- hclust(dist_matrix, method = "complete")
# 按距离阈值20切割聚类树
groups_hc <- cutree(hc, h = 20)
df$auto_group2 <- groups_hc

方法3:DBSCAN密度聚类(自动识别簇,支持孤立点)

适合存在孤立点的数据集,设置eps=20(簇内最大距离)、minPts=1(允许单个点作为簇),自动识别符合规则的聚类。

# 加载dbscan包(若未安装先运行:install.packages("dbscan"))
library(dbscan)

# 转换为矩阵格式
v1_matrix <- matrix(df$V1, ncol = 1)
# 执行DBSCAN聚类
db <- dbscan(v1_matrix, eps = 20, minPts = 1)
df$auto_group3 <- db$cluster

方法对比

  • 方法1:严格保留数据原始顺序,适合需要按出现顺序分组的场景;
  • 方法2:仅基于数值相似度分组,不考虑顺序,适合纯数值聚类需求;
  • 方法3:自动识别任意形状的簇,对孤立点友好,适合数据分布不规则的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:58