Привязать результат aplucter к датафрейму в R - PullRequest
0 голосов
/ 17 ноября 2018

Я выполняю кластерный анализ и должен использовать библиотеку apcluster

library(apcluster)

## create four synthetic 2D clusters
cl1 <- cbind(rnorm(30, 0.3, 0.05), rnorm(30, 0.7, 0.04))
cl2 <- cbind(rnorm(30, 0.7, 0.04), rnorm(30, 0.4, .05))
cl3 <- cbind(rnorm(20, 0.50, 0.03), rnorm(20, 0.72, 0.03))
cl4 <- cbind(rnorm(25, 0.50, 0.03), rnorm(25, 0.42, 0.04))
x <- rbind(cl1, cl2, cl3, cl4)

## run apcluster() (you may replace the Euclidean distance by a different
## distance, e.g. driving distance, driving time)
apres <- apcluster(negDistMat(r=2), x, q=0)

После кластеризации, выбранный кластер, я хочу присоединиться к x data.frame, чтобы увидеть наблюдение и что это за кластер. Я так и сделал

cbind(x, mycluster=apres$Clusters)

и ошибка

Error in apres$Clusters : $ operator not defined for this S4 class

Как мне поступить?

 [,1]           [,2]      cluster
  [1,] 0.3671142 0.6204475      2

1 Ответ

0 голосов
/ 17 ноября 2018

Первая проблема заключается в том, что apres не является объектом класса S3 и использование $ не сработает.Посмотрите apres, и вы увидите, что @ используется аналогичным образом.В частности, чтобы получить результирующие кластеры, вам нужно

cls <- apres@clusters

Следующее, что cls - это список из четырех элементов, каждый из которых содержит индексы наблюдений, принадлежащих соответствующему кластеру.Один из способов связать наблюдение (значение) с его кластером (именем) было бы

clsNm <- sort(setNames(unlist(cls), rep(1:length(cls), times = lengths(cls))))
head(clsNm)
# 1 1 1 1 1 1 
# 1 2 3 4 5 6 

Тогда мы можем сделать то, что вы пытались

head(cbind(x, cluster = as.integer(names(clsNm))), 2)
#                          cluster
# [1,] 0.2526693 0.6764543       1
# [2,] 0.2781545 0.6774726       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...