2014-12-18 15 views
5

Ich brauche ein paar Daten gruppieren und ich versuchte kmeans, pam und clara mit R.NA in Clustering-Funktionen (Kmeans, Pam, Clara). Wie verknüpfen Sie Cluster mit Originaldaten?

Das Problem ist, dass meine Daten in einer Spalte eines Datenrahmens sind, und enthält NAs.

Ich habe na.omit() verwendet, um meine Cluster zu bekommen. Aber wie kann ich sie den Originaldaten zuordnen? Die Funktionen geben einen Vektor von ganzen Zahlen ohne die NAs zurück und sie behalten keine Information über die ursprüngliche Position bei.

Gibt es eine clevere Möglichkeit, die Cluster den ursprünglichen Beobachtungen im Datenrahmen zuzuordnen? (Oder einen Weg, um intelligent Clustering durchzuführen, wenn NAs vorhanden sind?)

Dank

+0

haben Sie Ihre Reihen benannt? Ich denke, Kmeans und Pam (zumindest) behalten die Reihennamen, nicht wahr? – agenis

+0

versucht, aber nein:/ – Bakaburg

+0

Ich mache diesen Weg: kmeans (na.omit (x), k) – Bakaburg

Antwort

6

Der Ausgang des kmeans entspricht den als Argument übergebenen Elementen des Objekts x. In Ihrem Fall lassen Sie die NA Elemente weg und so gibt $cluster den Cluster an, zu dem jedes Element von na.omit(x) gehört.

Hier ist ein einfaches Beispiel:

d <- data.frame(x=runif(100), cluster=NA) 
d$x[sample(100, 10)] <- NA 
clus <- kmeans(na.omit(d$x), 5) 

d$cluster[which(!is.na(d$x))] <- clus$cluster 

Und in der Handlung unten, Farbe zeigt den Cluster, der jeden Punkt gehört.

plot(d$x, bg=d$cluster, pch=21) 

enter image description here

0

Dieser Code funktioniert für mich, mit einer Matrix ausgehend eine ganze Reihe von NAs enthält:

DF=matrix(rnorm(100), ncol=10) 
row.names(DF) <- paste("r", 1:10, sep="") 
DF[3,]<-NA 
res <- kmeans(na.omit(DF), 3)$cluster 
res 
DF=cbind(DF, 'clus'=NA) 
DF[names(res),][,11] <- res 
print(DF[,11])