将combn输出转换为dist类型矩阵并保留dim1标签信息
解决方案:将两两均值转换为带标签的dist矩阵
我来帮你搞定这个问题!你的思路已经对了一半——用combn拿到了两两元素的均值,现在只需要把这个向量转换成符合dist类型结构的对象,同时保留dim1的位置标签就行。以下是两种可行的方法,你可以按需选择:
方法一:直接构造dist对象
dist类型本质上是一个按特定顺序存储的向量,而combn返回的两两均值顺序刚好和dist要求的顺序完全匹配(顺序为:(1,2), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (3,4), (3,5), (4,5)),所以我们可以直接给这个向量加上dist类的属性:
首先先构造示例数据(和你提供的一致):
# 构造你的dataframe tab <- data.frame( dim1 = paste0("Loc.", 1:5), dim2 = c(0.325, 0.325, 0.321, 0.256, 0.255) )
然后计算两两均值并转换为dist对象:
# 计算两两均值向量 mean_vals <- combn(tab$dim2, 2, mean) # 直接构造dist对象,指定标签和样本量 mean_dist <- structure( mean_vals, class = "dist", size = nrow(tab), # 样本数量 Labels = tab$dim1, # 保留dim1的标签 Diag = FALSE, # 不显示对角线 Upper = FALSE # 不显示上三角 )
打印mean_dist就能看到带标签的结果:
print(mean_dist) # 输出结果: Loc.1 Loc.2 Loc.3 Loc.4 Loc.2 0.3250 Loc.3 0.3230 0.3230 Loc.4 0.2905 0.2905 0.2885 Loc.5 0.2900 0.2900 0.2880 0.2555
方法二:先构建对称矩阵再转dist对象
如果你更习惯先可视化矩阵结构,也可以先创建一个对称矩阵填充均值,再转换为dist对象:
# 初始化空的对称矩阵,设置行/列名为dim1的标签 mean_mat <- matrix(NA, nrow = nrow(tab), ncol = nrow(tab)) rownames(mean_mat) <- colnames(mean_mat) <- tab$dim1 # 填充下三角区域 mean_mat[lower.tri(mean_mat)] <- mean_vals # 对称填充上三角区域 mean_mat[upper.tri(mean_mat)] <- t(mean_mat)[upper.tri(mean_mat)] # 转换为dist对象 mean_dist2 <- as.dist(mean_mat, diag = FALSE, upper = FALSE)
这个方法得到的结果和方法一完全一致,如果你需要查看完整的对称矩阵,可以用as.matrix(mean_dist)来转换。
内容的提问来源于stack exchange,提问作者Chrys
相关产品推荐
相关产品推荐

