将hclust应用于距离矩阵列表

时间:2015-08-04 23:08:12

标签: r matrix cluster-analysis hierarchical-clustering

我试图寻找答案但找不到答案:

为了尝试对我的数据集中的每个用户ID执行特定的聚类(其中385个),我计算了每个用户与地理距离向量(半径距离)之间的欧几里德距离。然而,这导致了一个距离矩阵列表,我似乎无法弄清楚如何应用层次聚类。

实施例

按用户ID

拆分数据
user_id.split<-split(mydata$geodistancevector,mydata$userid)

计算每个分裂的欧氏距离

split.distances<-lapply(user_id.split,function(x) dist(x,method="euclidean"))

str(split.distances) 

导致列表385,例如

    >$ 1  :Class 'dist'  atomic [1:496] 1788.4 24.7 922.2 277.8 873.7 ...
    >.. ..- attr(*, "Size")= int 32
    >.. ..- attr(*, "Diag")= logi FALSE
    >.. ..- attr(*, "Upper")= logi FALSE
    >.. ..- attr(*, "method")= chr "euclidean"
    >``.. ..- attr(*, "call")= language dist(x = x, method = "euclidean")

    >$ 2  :Class 'dist'  atomic (0) 
     .. ..- attr(*, "Size")= int 0
     .. ..- attr(*, "Diag")= logi FALSE
     .. ..- attr(*, "Upper")= logi FALSE
     .. ..- attr(*, "method")= chr "euclidean"
      .. ..- attr(*, "call")= language dist(x = x, method = "euclidean")

等等...

如何在此距离列表中应用hclust?我希望能够将其切割成385(cutree),并将其绑定回原始数据框。

谢谢!

1 个答案:

答案 0 :(得分:0)

扩展我的评论; lapply函数将获取该函数(在其第二个参数中),并在其第一个参数的每个元素上运行它。

因此,要对hclust $1的元素$385运行split.distances,我们只需执行以下操作:

lapply(split.distances, hclust)

这将返回另一个列表,其中每个元素都是hclust$1的{​​{1}}。因此,要应用$385函数,我们可以对结果运行cutree

lapply

在我的评论中,我嵌套了函数调用,将上面的内容减少为:

hclust.results <- lapply(split.distances, hclust)
cutree.results <- lapply(hclust.results, cutree)