2014-12-18 43 views
5

muszę klastra niektóre dane i starałem kmeans, pam i clara z R.NA w funkcjach klastrowych (kmeans, pam, clara). Jak powiązać klastry z oryginalnymi danymi?

Problemem jest to, że moje dane są w kolumnie ramki danych i zawiera NAS.

Użyłem na.omit() do zdobycia moich klastrów. Ale jak mogę powiązać je z oryginalnymi danymi? Funkcje zwracają wektor liczb całkowitych bez NA i nie zachowują żadnych informacji o pierwotnej pozycji.

Czy istnieje sprytny sposób powiązania klastrów z oryginalnymi obserwacjami w ramce danych? (Lub aż do inteligentnego wykonania klastrów, kiedy NAS są obecne?)

Dzięki

+0

pan nazwał swoje wiersze? myślę, że kmeans i pam (przynajmniej) zachowują nazwy rzędu, prawda? – agenis

+0

próbował, ale nie:/ – Bakaburg

+0

Robię tak: kmeans (na.omit (x), k) – Bakaburg

Odpowiedz

6

Wyjście kmeans odpowiada elementom obiektu przekazanego jako argument x. W twoim przypadku pomijaj elementy NA, a więc $cluster wskazuje klastrze, do którego należy każdy element z na.omit(x).

Oto prosty przykład:

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 

A na poniższym wykresie, kolor wskazuje, że każdy punkt klastra należy.

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

enter image description here

0

Kod ten działa mi, wychodząc z matrycy zawierającej cały rząd NAS:

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])