访问 R 中对象中的列表(剪影函数)

Posted

技术标签:

【中文标题】访问 R 中对象中的列表(剪影函数)【英文标题】:Access a list in an object in R (silhouette function) 【发布时间】:2018-06-13 14:23:45 【问题描述】:

我使用 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")

【问题讨论】:

你用str检查过你的“kms”对象了吗?通过这种方式,你能找出如何访问想要的组件吗? 【参考方案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)

【讨论】:

【参考方案2】:

我也花了一些时间在谷歌上搜索。

如果你运行 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])

【讨论】:

以上是关于访问 R 中对象中的列表(剪影函数)的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用names函数为列表list中的所有数据对象设置名称使用names函数查看列表中所有数据的名称

R语言——列表

如何将参数值列表应用于 R 中的函数?

R - 如何从函数列表中删除元素

R语言基础知识|apply函数家族中的兄弟姐妹

R用户定义函数,返回多个类型对象