如何将data.frame转为距离矩阵用于层次聚类?解决DA缺失问题
解决方法:修复距离矩阵结构并转换为
dist对象 你的问题出在原始data.frame的结构不符合距离矩阵的要求——它的行名和列名没有覆盖所有样本,且不是对称/完整的三角矩阵。as.dist()和hclust()都需要行与列名完全一致的方阵(或规范的三角矩阵),下面是具体的修复步骤:
步骤1:整理原始数据,构建完整的距离矩阵
首先,我们明确所有样本:DA, DB, DC, DD, DE。然后把现有数据填充到一个完整的5×5矩阵中,确保对称位置的距离值一致,对角线为0(样本自身距离为0):
# 定义所有样本 samples <- c("DA", "DB", "DC", "DD", "DE") # 创建空的距离矩阵,行/列名为所有样本 dist_matrix <- matrix(0, nrow = length(samples), ncol = length(samples), dimnames = list(samples, samples)) # 填充已知的距离值 dist_matrix["DA", "DB"] <- dist_matrix["DB", "DA"] <- 0.39 dist_matrix["DA", "DC"] <- dist_matrix["DC", "DA"] <- 0.44 dist_matrix["DB", "DC"] <- dist_matrix["DC", "DB"] <- 0.35 dist_matrix["DA", "DD"] <- dist_matrix["DD", "DA"] <- 0.30 dist_matrix["DB", "DD"] <- dist_matrix["DD", "DB"] <- 0.48 dist_matrix["DC", "DD"] <- dist_matrix["DD", "DC"] <- 0.32 dist_matrix["DA", "DE"] <- dist_matrix["DE", "DA"] <- 0.50 dist_matrix["DB", "DE"] <- dist_matrix["DE", "DB"] <- 0.80 dist_matrix["DC", "DE"] <- dist_matrix["DE", "DC"] <- 0.91 dist_matrix["DD", "DE"] <- dist_matrix["DE", "DD"] <- 0.7
步骤2:转换为dist对象并传入hclust
现在这个矩阵是标准的对称距离矩阵,可以直接用as.dist()转换,再传给hclust():
# 转换为dist对象(默认取下三角,可通过upper参数调整) dist_obj <- as.dist(dist_matrix) # 查看转换后的dist对象(包含所有样本) dist_obj #> DA DB DC DD #> DB 0.39 #> DC 0.44 0.35 #> DD 0.30 0.48 0.32 #> DE 0.50 0.80 0.91 0.7 # 进行层次聚类 hc <- hclust(dist_obj) # 可以绘制聚类树 plot(hc)
为什么原来的方法会出错?
as.dist(df)丢失DA:你的原始data.frame行名是DB, DC, DD, DE,列名是DA, DB, DC, DD,行和列的样本集合不匹配。as.dist()会默认识别行和列的交集样本(DB, DC, DD),导致DA被排除,DE仅作为行样本保留与交集样本的距离。- 直接传
df给hclust报错:hclust()要求输入是dist对象或符合规范的距离矩阵(方阵、行/列名一致、无无效NA)。你的df不是方阵,且NA的位置不符合距离矩阵的三角结构,导致函数无法识别矩阵大小,触发错误。
内容的提问来源于stack exchange,提问作者umair durrani
相关产品推荐
相关产品推荐

