r - 基于成对距离的聚类组

标签 r

我有一个 n x n 矩阵,以成对距离作为条目。矩阵看起来像这样:

m = matrix (c(0, 0, 1, 1, 1, 1,0, 0, 1, 1, 0, 1,1, 1, 0, 1, 1, 0,1, 1, 1, 0, 1, 1,1, 0, 1, 1, 0, 1,1, 1, 0, 1, 1, 0),ncol=6, byrow=TRUE)
colnames(m) <- c("A","B","C","D","E","F")
rownames(m) <- c("A","B","C","D","E","F")

现在,如果与任何其他字母的距离为 0,我想将每个字母放在同一个簇中。对于上面的示例,我应该得到三个簇,其中包含:

(A,B,E)

(C,F)

(D)

我对每个集群中的条目数量感兴趣。最后,我想要一个像这样的向量:

簇大小 = c(3,2,1)

我认为使用 hclust 函数是可能的,但我无法提取三个簇。我也尝试过cutree函数,但是如果我不知道之前的簇数,也不知道高度的截止值,我该怎么办?

这是我尝试过的:

h <- hclust(dist(m),method="single")
plot(h) 

谢谢!

最佳答案

欢迎来到SO。

有多种方法可以处理此问题,但一个简单的选择是使用 igraph 包。

首先,我们将矩阵 m 转换为邻接矩阵。它包含到相邻节点的距离,其中 0 表示没有连接。因此,我们用 1 减去你的矩阵即可得到

mm <- 1 - m  
diag(mm) <- 0 # We don't allow loops

这给出

> mm
  A B C D E F
A 0 1 0 0 0 0
B 1 0 0 0 1 0
C 0 0 0 0 0 1
D 0 0 0 0 0 0
E 0 1 0 0 0 0
F 0 0 1 0 0 0

然后我们只需要将其提供给igraph来计算社区

library("igraph")
fastgreedy.community(as.undirected(graph.adjacency(mm)))

产生

IGRAPH clustering fast greedy, groups: 3, mod: 0.44
+ groups:
  $`1`
  [1] "A" "B" "E"

  $`2`
  [1] "C" "F"

  $`3`
  [1] "D"

现在,如果您保存该结果,您可以立即获得社区规模

res < fastgreedy.community(as.undirected(graph.adjacency(mm)))
sizes(res)

产生

Community sizes
1 2 3 
3 2 1 

关于r - 基于成对距离的聚类组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612171/

相关文章:

r - 获取数字范围内的数字列表

r - 仅对某些列进行水平合并

r - 惰性求值和 Promise 数据结构

r - ggplot2,你如何使用函数内的访问数据框元素?

r - 从 R 执行时 SQL Server 查询失败

r - 如何检查集合A是否是R中集合B的子集?

R:使用 lme4 的 lmList 出现奇怪的错误

r - 使用 Sys.time() 对 R 代码进行计时

r - 如何量化个体中的观察对

r - 循环遍历data.frame中的列,并根据循环中的计算创建一个新的data.frame