我正在试图找到一种方法来找到我的数据中的 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 持开放态度,如果有的话.

推荐答案

也许你可以用decompose,例如,

x %>%
    filter(rel > 0) %>%
    graph_from_data_frame() %>%
    decompose()

这给了我们

[[1]]
IGRAPH e456d6d DN-- 4 10 --
+ attr: name (v/c), rel (e/n)
+ edges from e456d6d (vertex names):
 [1] A1->A1 A1->A2 A2->A1 A2->A2 A2->A3 A3->A2 A3->A3 A3->A4 A4->A3 A4->A4

[[2]]
IGRAPH e456d92 DN-- 4 8 --
+ attr: name (v/c), rel (e/n)
+ edges from e456d92 (vertex names):
[1] B1->B1 B1->B4 B2->B2 B2->B4 B3->B3 B3->B4 B4->B1 B4->B4

R相关问答推荐

有没有方法将paste 0功能与列表结合起来?

给定R中另一行中的值,如何插补缺失值

大规模重新标记haven标签数据

R Highcharts与两个位置关联的注释

r—绘制相交曲线

R for循环返回到先前值

在R中使用download. file().奇怪的URL?

即使硬币没有被抛出,也要保持对其的跟踪

在RStudio中堆叠条形图和折线图

您是否可以折叠R中的重复行,同时保留基于所选列的值?

如何在R中通过多个变量创建交叉表?

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

在数据帧列表上绘制GGPUP

为什么这个表格格罗布不打印?

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

如何将EC50值绘制在R中的剂量-react 曲线上?

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

在shiny 表格中输入的文本在第一次后未更新

Ggplot2:添加更多特定 colored颜色 的线条

合并多个数据帧,同时将它们的名称保留为列名?