2016-04-25 9 views
1

Als jemand relativ neu zu R habe ich ein Problem mit dem Erstellen einer for-Schleife.Ausgabe mehrerer Vektoren aus For-Schleife in R

Ich habe einen sehr großen Datensatz mit 9000 Beobachtungen und 25 kategorischen Variablen, die ich in binäre Daten und vorgeformte hierarchische Cluster umgewandelt habe. Nun möchte ich K-Modes-Clustering versuchen, um eine Elbow-Plot unter Verwendung der "innerhalb des Clusters einfach passenden Entfernung für jeden Cluster" zu erzeugen, die von kmodes$withindiff ausgegeben wird. Ich kann dies für jeden der k in 1:8 Cluster summieren, um den Elbow Plot zu erhalten.

Mein Problem ist, dass ich weitere Ausgabe von k-Modi wollen. Für jede k in 1:8 möchte ich den Vektor der Ganzzahlen erhalten, die den Cluster angeben, dem jedes Objekt durch kmodes$cluster gegeben ist. Ich muss eine for-Schleife erstellen, die jede k in 1:8 Schleife durchschreibt und jeden der Ausgaben in 8 separaten Vektoren speichert. Aber ich weiß nicht, wie man so eine Schleife macht. Ich könnte einfach die 8 Zeilen Code getrennt ausführen, aber sie nehmen jeweils 15 Minuten mit iter.max=10 laufen, so dass dies auf iter.max=100 erhöht werden muss über Nacht laufen gelassen werden, so dass eine Schleife nützlich wäre.

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) 

Letztlich mag ich die Ergebnisse aus dem hierarchischen binären Clustering des k-Modi Clustering vergleichen mit dem eingestellten Rande Index zu bekommen. Zum Beispiel Schneiden des Baumes bei k=4 für den hierarchischen Cluster und vergleichen diese mit einer 4-Cluster-Lösung von k-Modi:

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) 

Antwort

0

Die beste Methode ist, um die Ausgabe von Ihrem Cluster in eine benannten Liste zu setzen:

library(klaR) 

myClusterList <- list() 

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

Sie können dann leicht die irgendwas vom Inhalt herausziehen:

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

oder

sum(myClusterList[[1]]$withindiff) 

Sie können die Liste auch für zukünftige R-Sitzungen speichern, siehe ?save.

+0

Dies funktionierte gut und dauerte nicht so lange wie erwartet. Der sichere Tipp war auch sehr nützlich, Prost. – PennyR

0

Ich stimme mit Imo, die Verwendung einer Liste ist die beste Lösung. Wenn Sie wollen das nicht tun, könnten Sie auch assign() verwenden, um einen neuen Vektor in jeder Iteration zu erstellen:

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