我有一个1和0的矩阵。我想要做的是将具有1的单元格分组成簇,并计算矩阵中存在的簇的数量以及这些簇的大小。
如果n的数字(在这种情况下至少4个单元格彼此接近的4个单元格)彼此靠近(彼此立即向上,向下,向左或向右),则将它们视为单个集群并输出集群数量及其规模。
例如矩阵看起来像这样:
> m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 1 1 1 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 1 0 0 0 0 0 0 0
[5,] 0 0 1 0 0 0 0 1 1 0
[6,] 0 0 0 0 0 0 0 0 1 1
此矩阵具有的簇数为2个簇。一个7 1的集群和另一个4 1的集群。我一直在努力让它发挥作用并且似乎无法解决这个问题。
输出可以像这样简单:
> output
cluster size
1 7
2 4
答案 0 :(得分:3)
您可以使用包SDMTools中的函数ConnCompLabel
来标记二进制矩阵中的连接组件:
R> ConnCompLabel(m)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 1 1 1 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 1 0 0 0 0 0 0 0
[5,] 0 0 1 0 0 0 0 2 2 0
[6,] 0 0 0 0 0 0 0 0 2 2
R> tab <- table(ConnCompLabel(m))[-1]
R> tab[tab >= 4]
1 2
7 4