Доступ к списку в объекте в R (функция силуэта)
Я запустил k-средство для кластеризации с 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")
1 ответ
Я сделал это таким образом, я надеюсь, что это служит вам.
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)
Мне также потребовалось немного погуглить.
Если вы запустите str(kms), вы поймете, что он состоит из матрицы, за которой следует 3 attr (доступ через attr())
например
>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])