r - 从最小尺寸的矩阵值生成数值簇

标签 r matrix

我有一个由 1 和 0 组成的矩阵。我想做的是将具有 1 的单元格分组并计算矩阵中存在的簇的数量以及这些簇的大小。

如果 n 个 1(在本例中至少有 4 个值为 1 的单元格彼此靠近)彼此靠近(彼此紧邻上、下、左或右,则将它们视为单个簇并输出簇的数量及其大小。

例如,矩阵如下所示:

> 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

最佳答案

您可以使用包 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 

关于r - 从最小尺寸的矩阵值生成数值簇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738648/

相关文章:

r - 如何在同一图表中用条形图表示两个时间序列之间的差异?

r - 将对象名称传递给 do.call() 函数

r - 如果case_when找到特定结果,则停止执行

r - 在 R 中索引矩阵

c++ - 检查矩阵相乘结果的方法?

r - 使用相似数据帧的内容来提高更新大数据帧内容的性能

r - 使用 dplyr 编程时 ensym 和 enquo 有什么区别?

r - 从行、列、值列表填充矩阵

android - 动画转换

java - 以最小成本(时间和空间)的图形表示