Доступ к списку в объекте в R (функция силуэта)

Я запустил k-means для кластеризации с 5 кластерами.

km <- kmeans(data1z, 5)

Для полученного решения кластеризации я хотел бы более подробно рассмотреть коэффициент силуэта.

library(cluster)
kms <- silhouette(km$cluster, dist(data1z))

Когда я смотрю на kms, я вижу, что среди прочего есть список с 4 столбцами, содержащий номер наблюдения, кластер, сосед и sil_width.

Моя цель - получить доступ к этому списку и сохранить его как фрейм данных.

При вводе attributes(kms) я вижу, что этот список называется $dimnames[[2]].

К сожалению, дальше команды attributes(kms)$dimnames[2] я не дохожу, где снова вижу только заголовки столбцов.

Есть ли у кого-нибудь подсказка, как получить доступ к этому списку и как сохранить его как фрейм данных?

Вот набор данных для воспроизведения:

data1z <- structure(list(ewz_2015 = c(12.3021483912036, 6.00431244756797, 
4.779267671771, 3.36240424966866, 2.17055661812825, 1.77453900433742, 
1.73252006339734, 1.63802469941643, 1.62509551490745, 1.54457617410254, 
1.53364252580256, 1.48406671823494, 1.44167702193362, 1.36102682629534, 
1.29289507638349, 0.833125714742489, 0.779707863872641, 0.718075237351878, 
0.666165851922353, 0.634288160569021, 0.62598614836252, 0.618807306809176, 
0.548269281905782, 0.511353679467419, 0.453741204216529), `ewz_2011-2015%` = c(1.39613656271163, 
0.607258369151278, 1.58299833983535, 0.869374153763874, 2.47422861813756, 
1.26635046973522, 0.516361108243701, -0.0231779755856095, 0.138107778444893, 
3.16774974965261, -0.0753473600679229, 1.04625956881232, 0.791887976779923, 
0.620263594519286, -0.816319108567795, -0.893520732827146, -0.199721969111692, 
-0.366631601460676, 0.449431084621143, 1.32617159421819, 1.20542758697938, 
0.994137944732868, 1.59988312849927, -0.304095591697581, -0.75135416084694
), `wander_2011-2015Ø` = c(12.7557665621901, 4.35832738812673, 
5.09045816442083, 2.64251455289482, 3.08786901008964, 1.91169325750985, 
1.16450345076077, 0.983664137210036, 1.54693735027193, 3.41661419232651, 
0.860114613433702, 1.37886547558521, 1.18414566439771, 1.20319861162554, 
0.2222664625969, 0.165762361367978, 0.384183777010717, 0.0847054930928842, 
0.362642816055543, 1.3209864194017, 0.834252365478401, 0.718821623338668, 
0.925719606981072, 0.0520339444101122, 0.0355999590005416), alter_2015 = c(-0.795452185805918, 
-1.07302292239275, -1.40333685910657, -1.34690303328897, -1.91815169287439, 
-1.37100226741981, -0.595290898752181, -0.365235516337521, 0.0822720690988413, 
-0.738268589162625, -0.178511147449755, -0.703870795263088, -0.990947412522991, 
-0.534494948654483, -0.178710886267292, 0.334623380729479, -0.127973906699767, 
-0.783759886944363, -1.45250245534342, -1.85605680531628, -1.17977119761638, 
-1.1146728315242, -0.76966585145387, -0.717887352917514, -0.185025056153872
), `wohn_2015/ewz` = c(0.536981056223323, 0.0977036963071221, 
0.439785877795005, 0.114031432514775, 0.0602824633607677, -0.500555610996494, 
0.806802317088195, 0.393695162242274, 0.428285715377852, 1.76545423345811, 
0.125639381279224, 0.744169728769213, 0.778027562679934, 0.402207878643676, 
0.14118545812779, 0.57834537462665, 0.689548342207427, -0.209153915991276, 
0.285452430924394, 0.1339991931372, -0.227290305128167, 0.524430279211976, 
0.146456452575513, -0.173054623600596, 0.315209504451725)), .Names = c("ewz_2015", 
"ewz_2011-2015%", "wander_2011-2015Ø", "alter_2015", "wohn_2015/ewz"
), row.names = c(NA, 25L), class = "data.frame")

person SCW16    schedule 03.01.2018    source источник
comment
Вы проверили свой объект kms с помощью str? Можете ли вы таким образом узнать, как получить доступ к нужному компоненту?   -  person alexis_laz    schedule 04.01.2018


Ответы (2)


Я сделал это таким образом, я надеюсь, что это служит вам.

km <- kmeans(data1z, 5)
library(cluster)
kms <- silhouette(km$cluster, dist(data1z))
class(kms)
kms2<-as.data.frame(cbind(cluster=kms[,1],neighbor=kms[,2],sil_width=kms[,3]))
class(kms2)
person Rafael Díaz    schedule 04.01.2018

Мне также потребовалось немного поиска в Google.

Если вы запустите str(kms), вы поймете, что он состоит из матрицы, за которой следуют 3 attr (доступ через attr())

e.g.

>str(some.silhouette.obj)
 silhouette [1:137, 1:3] 1 2 2 1 1 1 1 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:3] "cluster" "neighbor" "sil_width"
 - attr(*, "Ordered")= logi FALSE
 - attr(*, "call")= language silhouette.default(x = as.numeric(km$cluster), dist = dist(data1z))

Чтобы вытащить матрицу в виде кадра данных, просто выполните:

>data.frame(kms[,1:3])
person SplitInf    schedule 05.11.2019