在R语言中基于单个变量查找数据集中相似组的最优方法
识别年份间的相似组(基于多变量特征)
针对你的需求,以下是用R实现的标准化流程,可直接适配500个变量的大规模数据集:
1. 数据格式转换(长转宽)
首先需要将长格式数据转换为宽格式:每行对应一个年份,每列对应一个特征变量(比如你的500个变量,或示例中的多个Timings观测)。
示例代码:
# 为每个年份的观测添加索引 gfg_data$obs_id <- ave(gfg_data$year, gfg_data$year, FUN = seq_along) # 转换为宽格式 wide_data <- reshape(gfg_data, idvar = "year", timevar = "obs_id", direction = "wide") colnames(wide_data) <- c("year", paste0("Timing_", 1:(ncol(wide_data)-1)))
2. 变量标准化(推荐)
如果变量量纲差异较大(比如有的是数值、有的是百分比),必须先标准化,避免量纲干扰相似度计算:
scaled_data <- scale(wide_data[, -1])
3. 计算相似度/距离矩阵
使用欧氏距离(连续变量最常用)计算年份间的特征距离:
dist_matrix <- dist(scaled_data, method = "euclidean")
若变量是二元类型,可替换为method = "jaccard"
4. 聚类分组
方法一:层次聚类(适合小样本,可视化直观)
# 用ward.D2方法构建聚类树(最小化组内方差) hc <- hclust(dist_matrix, method = "ward.D2") # 绘制聚类树,查看年份间的相似关系 plot(hc, labels = wide_data$year, main = "年份聚类树(基于多变量特征)") # 切割聚类树得到分组(示例分成2组) groups <- cutree(hc, k = 2) # 查看分组结果 cbind(year = wide_data$year, group = groups)
方法二:K-Means聚类(适合大样本,计算高效)
针对500个变量的大规模数据,K-Means速度更快:
# 指定聚类数k=2,nstart=20避免局部最优 km <- kmeans(scaled_data, centers = 2, nstart = 20) # 查看分组结果 cbind(year = wide_data$year, group = km$cluster)
方法三:PCA降维+聚类(超大规模数据优化)
当变量过多时,先通过PCA降维减少计算量,再聚类:
# PCA降维,保留90%解释方差的主成分 pca <- prcomp(scaled_data, scale. = FALSE) cum_var <- cumsum(pca$sdev^2 / sum(pca$sdev^2)) n_comp <- which(cum_var >= 0.9)[1] pca_data <- pca$x[, 1:n_comp] # 降维后执行层次聚类 hc_pca <- hclust(dist(pca_data), method = "ward.D2") plot(hc_pca, labels = wide_data$year, main = "PCA降维后的年份聚类树") groups_pca <- cutree(hc_pca, k = 2)
关键说明
- 聚类数k的选择:可通过观察聚类树的高度拐点,或计算轮廓系数(silhouette score)确定最优分组数。
- 距离与聚类方法:可根据变量类型调整距离算法,聚类方法也可尝试
complete、average等,对比结果选择最贴合业务逻辑的分组。
内容的提问来源于stack exchange,提问作者EV_Mustang
相关产品推荐
相关产品推荐

