簡體   English   中英

從R中的for循環輸出多個向量

[英]Output multiple vectors from for loop in R

作為一個相對較新的R,我遇到了創建for循環的問題。

我有一個非常大的數據集,包含9000個觀測值和25個分類變量,我已將其轉換為二進制數據和預先形成的層次聚類。 現在,我想嘗試K-Modes聚類,使用“每個聚類的簇內簡單匹配距離”生成一個彎頭圖,從kmodes$withindiff輸出。 我可以為k in 1:8簇中的每個k in 1:8求和,得到肘圖。

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模式進一步輸出。 對於k in 1:8每個k in 1:8我想得到整數向量,表示每個對象被分配到的kmodes$clusterkmodes$cluster給出。 我需要創建一個for循環, k in 1:8遍歷每個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)

最后,我想通過獲取調整后的蘭特指數,將分層二進制聚類的結果與k模式聚類進行比較。 例如,在層級集群中以k=4切割樹,並將其與來自k模式的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))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM