r - 使用 For 循环分层聚类不同的链接
问题描述
我正在尝试在各种距离矩阵上执行多个层次聚类并使用不同的链接进行比较。
为了简化任务,我尝试创建一个函数,该函数将遍历一组链接方法以生成agnes
对象,但无济于事。
这是该函数应该执行的操作的示例:
library(cluster)
Links <- c("single","average","ward") # vector of linkage methods
ClustH <- list() # list to hold HClusts
set.seed(123)
A <- rnorm(3, mean = 5, sd = 1)
B <- rnorm(3, mean = 2, sd = 1)
C <- rnorm(3, mean = 0, sd = 1)
DMat <- as.dist(cbind(A,B,C)) # distance matrix
for(i in 1:length(Links)){
ClustH[i] <- agnes(DMat, method = Links[i])
}
ClustH[1]
#[[1]]
#[1] 1 2 3
它不是将整个 agnes 对象保存在列表的每个元素中,而是仅保存通过获取的对象的第一个元素(即顺序)<agnes object>$order
我究竟做错了什么?您不能将列出的对象保存在列表中吗?有什么建议吗?
解决方案
回答
修改循环以使用[[
而不是[
:
ClustH[[i]] <- agnes(DMat, method = Links[i])
基本原理
[
使用和子集时,列表具有特定的行为[[
。使用[
,我们实际上取了给定长度的列表子集。输出将始终是一个列表,只是它的一个子集。使用[[
,我们可以直接访问列表中的一个元素。举个例子:
m <- list(1, 2, 3)
m[1]
#[[1]]
#[1] 1
m[[1]]
# [1] 1
由于 的输出agnes
实际上也是一个列表,因此它试图ClustH
用agnes
输出的元素覆盖 的元素。由于i
长度为1
,它只会用输出的第一个元素覆盖一个元素agnes
:
List of 8
$ order : int [1:3] 1 2 3
$ height : num [1:2] 4.77 3.72
$ ac : num 0.147
$ merge : int [1:2, 1:2] -2 -1 -3 1
$ diss : 'dissimilarity' num [1:3] 4.77 6.56 3.72
..- attr(*, "Labels")= chr [1:3] "A" "B" "C"
..- attr(*, "Size")= num 3
..- attr(*, "call")= language as.dist.default(m = cbind(A, B, C))
..- attr(*, "Diag")= logi FALSE
..- attr(*, "Upper")= logi FALSE
..- attr(*, "Metric")= chr "unspecified"
$ call : language agnes(x = DMat, method = Links[1])
$ method : chr "single"
$ order.lab: chr [1:3] "A" "B" "C"
- attr(*, "class")= chr [1:2] "agnes" "twins"
换句话说,整数向量1 2 3
。
建议
如果您想将列表作为输出,您还可以考虑切换到lapply
:
ClustH <- lapply(Links, function(x) agnes(DMat, methods = x))
# From R version 4.1 onwards, this also works
ClustH <- lapply(Links, \(x) agnes(DMat, methods = x))
推荐阅读
- jenkins - 如何在 Jenkins 中使用 ssh Api Key
- c# - C# ref 返回值和可移动变量
- php - 类似 SAAS 的 Firebase 身份验证
- python - 从 X 射线图像中检测和分割感兴趣区域
- android - react-native 在底部标签导航中隐藏屏幕的特定标签
- python - 我可以访问 fatimatestpro.pythonanywhere.com 但不能访问 fatimatestpro.pythonanywhere.com/help/
- java - 为什么我使用 Spring Boot 获得“需要 NOAUTH 身份验证”?
- reactjs - React-router-dom 重定向但不渲染
- php - 如何在 Magento 2 的订单中获取每个产品的总行数?
- woocommerce - Woocommerce 在产品页面上隐藏前缀