如何用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
相关产品推荐
相关产品推荐

