gpt4 book ai didi

r - 使用For循环对不同链接进行层次聚类

转载 作者:行者123 更新时间:2023-12-04 07:37:35 24 4
gpt4 key购买 nike

我正在尝试在各种距离矩阵上执行多个层次聚类,并使用不同的链接进行比较。
为了简化任务,我尝试创建一个函数来迭代一组链接方法以生成 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))

关于r - 使用For循环对不同链接进行层次聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67656517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com