从R中的for循环输出多个向量

Output multiple vectors from for loop in R

作为 R 的新手,我在创建 for 循环时遇到了问题。

我有一个非常大的数据集,其中包含 9000 个观察值和 25 个分类变量,我已将其转换为二进制数据并进行了层次聚类。现在我想尝试使用 K-Modes 聚类来使用从 kmodes$withindiff 输出的 "within-cluster simple-matching distance for each cluster" 生成 Elbow Plot。我可以对每个 k in 1:8 集群求和以获得 Elbow Plot。

library(klaR)
for(k in 1:8)
{
WCSM[k] <- sum(kmodes(data,k,iter.max=100)$withindiff)
}
plot(1:8,WCSM,type="b", xlab="Number of Clusters",ylab="Within-Cluster 
Simple-Matching Distance Summed", main="K-modes Elbow Plot")

我的问题是我想要 k-modes 的进一步输出。对于每个 k in 1:8,我想获得整数向量,指示每个对象分配给由 kmodes$cluster 给定的集群。我需要创建一个 for 循环,循环遍历每个 k in 1:8 并将每个输出保存到 8 个单独的向量中。但是我不知道如何做这样的for循环。我可以单独 运行 这 8 行代码,但是它们每行需要 15 分钟才能 运行 和 iter.max=10 所以将它增加到 iter.max=100 将需要留下 运行过夜,所以循环会很有用。

cl.kmodes2=kmodes(data, 2,iter.max=100)
cl.kmodes3=kmodes(data, 3,iter.max=100)
cl.kmodes4=kmodes(data, 4,iter.max=100)
cl.kmodes5=kmodes(data, 5,iter.max=100)
cl.kmodes6=kmodes(data, 6,iter.max=100)
cl.kmodes7=kmodes(data, 7,iter.max=100)
cl.kmodes8=kmodes(data, 8,iter.max=100)

最后,我想通过获取 Adjusted Rand Index 来比较层次二元聚类和 k-modes 聚类的结果。例如,在 k=4 处为层次聚类切割树并将其与 k-modes 的 4 聚类解决方案进行比较:

dist.binary = dist(data, method="binary")
cl.binary = hclust(dist.binary, method="complete")
hcl.4 = cutree(cl.binary, k = 4)
tab = table(hcl.4, cl.kmodes4$cluster)
library(e1071)
classAgreement(tab)

最好的方法是将集群的输出放入命名列表中:

library(klaR)

myClusterList <- list()

for(k in 1:8) {
  myClusterList[[paste0("k.", i)]] <- kmodes(data, i,iter.max=100)
}

然后您可以轻松地提取任何内容:

sum(myClusterList[["k.1"]]$withindiff)

sum(myClusterList[[1]]$withindiff)

您还可以保存列表以在未来的 R 会话中使用,请参阅 ?save

我同意 Imo,使用列表是最好的解决方案。 如果你不想这样做,你也可以使用 assign() 在每次迭代中创建一个新向量:

library(klaR)
for(k in 1:8) {
  assign(paste("cl.kmodes", k, sep = ""), kmodes(data, k, iter.max = 100))
}