我正在试图找到一种方法来找到我的数据中的 node 所属的集群/社区,给出一个关系表或邻接矩阵.我将社区定义为具有任何直接或间接连接的 node .我希望我的数据集中具有直接/间接连接的所有 node 都在同一集群/社区内.没有任何直接/间接连接的 node 必须放置在不同的集群/社区中.
我该怎么做呢?
下面是我的数据外观的玩具示例.假设我有两个组A和B,每个组有四个人,分别是1,2,3,4.我不知道这两个组是否存在先验.我可以访问一个表,它为我提供了 node 之间的关系.如果A*或B*与A**或B**相关,则关系列rel
取值1.我不知道这两个群体是否存在.我的任务是根据所有单位的直接/间接关系找到它们所属的小组.在本例中,名称以A开头的单位以独占方式彼此链接.B也是.
x <- tibble(name = rep(c(paste0("A", 1:4), paste0("B", 1:4)), each = 8),
peer = rep(c(paste0("A", 1:4), paste0("B", 1:4)), times = 8)) |>
# Relationships
mutate(rel = case_when(str_detect(name, "A") & str_detect(peer, "B") ~ 0,
# Units are related to themselves
name == peer ~ 1,
# A1 and A2 are peers; A3 and A4 are peers
name %in% c("A1", "A2") & peer %in% c("A1", "A2") ~ 1,
name %in% c("A3", "A4") & peer %in% c("A3", "A4") ~ 1,
# A2 and A3 are peers
(name == "A2" & peer == "A3") | (name == "A3" & peer == "A2") ~ 1,
# B1 and B4 are peers;
(name == "B1" & peer == "B4") | (name == "B4" & peer == "B1") ~ 1,
# B2 and B3 is peers with B4 only
(name %in% c("B2", "B3") & peer == "B4") | (name == "B4" & peer == c("B2", "B3")) ~ 1,
TRUE ~ 0))
我try 使用igraph::cluster_fast_greedy()
,但我注意到它并不总是将所有具有直接/间接连接的 node 放在同一组中.我对使用数据争论/数据操作而不是社交网络分析中的算法的 idea 持开放态度.
编辑:在try 了一下之后,我发现igraph::clusters()
或igraph::components()
似乎满足了我的需求.对其他 idea 持开放态度,如果有的话.