R语言中如何按样本与聚类的距离合并两张表
解决样本与聚类中心距离的表格合并问题
没问题,我来帮你实现这个需求——把样本表和聚类中心表转换成每个样本对应各聚类中心距离的宽格式表格。下面是具体的R代码实现步骤,我会一步步讲清楚:
1. 先模拟你的输入数据
首先我们先创建和你描述一致的示例表格,方便后续测试:
# 样本表 samples_df <- data.frame( Sample = c("Sample1", "Sample2", "Sample3"), X = c(1.5, 1.2, 0.82), Y = c(2.32, 4.22, 531), Z = c(123.1, 23.2, 543.2) ) # 聚类中心表 clusters_df <- data.frame( Cluster = c(1, 2, 3), X = c(1.5, 1.2, 0.82), Y = c(2.32, 4.22, 531), Z = c(123.1, 23.2, 543.2) )
2. 提取数值特征列
我们需要把表格里的非数值列(Sample和Cluster)去掉,只保留用于计算距离的特征列:
# 提取样本的数值特征 samples_features <- samples_df[, -which(names(samples_df) == "Sample")] # 提取聚类中心的数值特征 cluster_features <- clusters_df[, -which(names(clusters_df) == "Cluster")]
3. 计算样本到聚类中心的距离
这里默认用欧氏距离(最常用的距离度量),我们可以用apply函数遍历每个样本,计算它到每个聚类中心的距离:
# 计算距离矩阵:每行是一个样本,每列是一个聚类中心的距离 distance_matrix <- t(apply(samples_features, 1, function(sample_row) { # 计算当前样本到每个聚类中心的欧氏距离 apply(cluster_features, 1, function(cluster_row) { sqrt(sum((sample_row - cluster_row)^2)) }) })) # 给距离矩阵设置合适的列名和行名 colnames(distance_matrix) <- paste0("Cluster", clusters_df$Cluster) rownames(distance_matrix) <- samples_df$Sample
4. 转换成目标格式的表格
最后把样本名和距离矩阵合并成你需要的dataframe:
# 合并成最终表格 result_df <- data.frame(Sample = rownames(distance_matrix), distance_matrix, row.names = NULL) # 查看结果 print(result_df)
运行后你会得到和你预期完全一致的表格:
Sample Cluster1 Cluster2 Cluster3 1 Sample1 0.0 100.0105 614.2043 2 Sample2 100.0105 0.0 634.1324 3 Sample3 614.2043 634.1324 0.0
可选:更换距离度量
如果你需要用其他距离(比如曼哈顿距离),只需要修改距离计算的逻辑即可:
# 曼哈顿距离版本 distance_matrix_manhattan <- t(apply(samples_features, 1, function(sample_row) { apply(cluster_features, 1, function(cluster_row) { sum(abs(sample_row - cluster_row)) }) }))
这样就能灵活适配不同的距离需求啦!
内容的提问来源于stack exchange,提问作者Chen Mor




