Сопоставьте и добавьте номер кластера к исходным данным
Я использую обычный метод для создания проекта иерархической кластеризации.
mydata.dtm <- TermDocumentMatrix(mydata.corpus)
mydata.dtm2 <- removeSparseTerms(mydata.dtm, sparse=0.98)
mydata.df <- as.data.frame(inspect(mydata.dtm2))
mydata.df.scale <- scale(mydata.df)
d <- dist(mydata.df.scale, method = "euclidean") # distance matrix
fit <- hclust(d, method="ward")
groups <- cutree(fit, k=10)
groups
congestion cough ear eye fever flu fluzonenon medicare painpressure physical pink ppd pressure
1 2 3 4 5 6 5 5 5 7 4 8 5
rash screening shot sinus sore sports symptoms throat uti
5 5 6 1 9 7 5 9 10
И я хочу вернуть номер группы в новый столбец исходных данных. Я посмотрел на приблизительное совпадение строк в одном списке - r Потому что здесь df - это матрица документов, так что я получил после df <- t(data.frame(mydata.df.scale,cutree(hc,k=10)))
это как матрица
df[1:5,1:5]
congestion cough ear eye fever
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 0
Так как у глаза есть группа с номером 3, я хочу добавить номер 3 к новому столбцу в 4-й строке.
обратите внимание, что в этом случае один документ может быть сопоставлен с двумя элементами в одной группе.
df[23,17:21]
sinus sore sports symptoms throat
0 1 0 0 1
1 ответ
Вместо прямого возврата числа я использую матрицу 0-1:
label_back <-t(data.frame(mydata.df,cutree(fit,k=10)))
row.names(label_back) <- NULL
#label_back<-label_back[1:(nrow(label_back)-1),]# the last line is the sum
groups.df<-as.data.frame(groups)
groups.df$label<-rownames(groups.df)
for (i in 1:length((colnames(label_back)))){
ind<-which(colnames(label_back)[i]==groups.df$label) # match names and return index
label_back[,i]=groups.df$groups[ind]*label_back[,i] # time the 0-1 with the #group number
}
найдите максимальное значение в каждой строке, потому что в некоторых строках содержится более 1 значения.
data_group<-rep(0,nrow(data)
for (i in 1:nrow(data)){
data_group[i]<-max(unique(label_back[i,]))
}
data$group<-data_group
Я ищу более элегантный способ.