我有以下结构的图形数据:
library(data.table)
dt = data.table(
n1 = c(1, 1, 2, 4, 6),
n2 = c(2, 3, 3, 5, 3)
)
> dt
n1 n2
1: 1 2
2: 1 3
3: 2 3
4: 4 5
5: 6 3
其中dt
描述节点之间的链路。我想以下面的方式来识别这个结构中的集群集合:
output = data.table(
node = 1:6,
grp = c(1,1,1,2,2,1)
)
> output
node grp
1: 1 1
2: 2 1
3: 3 1
4: 4 2
5: 5 2
6: 6 1
当然,我可以使用igraph
库来做到这一点:
library(igraph)
g = graph_from_data_frame(dt)
plot(g)
> clusters(g)$membership
1 2 4 6 3 5
1 1 2 1 1 2
但是,我想尽量减少图书馆的使用。因此,我想使用data.table
或base R来确定一个高效的操作,该操作使用dt
生成成员关系表output
。我怀疑它会涉及到dt
上的一系列自连接,但还没有能够在具有多个集群的缩放数据上实现这一点。
3条答案
按热度按时间1cklez4t1#
这不是一个微不足道的问题。我的解决方案是创建第二个
dt
(dt1
)并删除其行,同时将每对节点分配给某个组。我的第一选择
可以进一步优化,如果你玩它。
导致:
第二个选项
cqoc49vn2#
选项一
如果只需要顶点的分组信息
你将获得
选项二
如果您想在列表中对
dt
的行进行分组,这里有一个选项使得
选项三
另一个有趣的实现可能是使用***递归***来实现它
我们将获得
a14dhokn3#
下面是一个性能与
igraph
相当的解决方案。测试功能。
在一个更大的问题上比较
igraph
的计时。