R如何对行之间的部分重叠值进行分组?

R how to group part of overlapped values among rows?

我有一个数据框,其中一些行需要根据行之间的一些重叠值进一步分组

col1, col2
a1,   2;3 
a2,   2
a3,   3;4
a4,   4
a5,   2;4
a6,   5
a7,   5;6
a8,   6;7

col2中的值2出现在第1,2行和第5行,因为值3是第2行1和第5行的值4和2定义为一组,那么值3和4都可以算作1组as 2;

组2也是一样,值5在第6行和第7行重叠,值6和值7是同一个case bonded,所以它们也可以归为一组。

因此,输出可以汇总到名为组的新列中,如下所示:

col1, col2, group
a1,   2;3,  1
a2,   2,    1
a3,   3;4,  1
a4,   4,    1
a5,   2;4,  1
a6,   5,    2    
a7,   5;6,  2
a8,   6;7,  2

有什么想法可以使用 tidyverse/dplyr 吗?非常感谢!

这基本上是一个图形问题,您需要在其中找到相连的子图。这对于 igraph 库来说非常简单,唯一棘手的部分是正确地重塑数据。所以用样本数据

dd <- structure(list(col1 = c("a1", "a2", "a3", "a4", "a5"), col2 = c("2;3", 
"2", "3;4", "4", "2;4")), class = "data.frame", row.names = c(NA, 
-5L))

您可以使用

library(dplyr)
library(tidyr)
library(igraph)

dd %>% 
  separate_rows(col2) %>% 
  select(col1, col2) %>% 
  graph_from_data_frame(directed = FALSE) %>% 
  clusters() %>% 
  membership() %>% 
  tibble::enframe() %>% 
  right_join(dd, by=c("name"="col1"))

我们将数据扩展到不同的行,然后连接无向图中的所有边。我们 运行 进行简单的社区检测,并将这些结果强制返回到我们加入原始数据的数据框中。这确实假设 col1 中的值不与 col2 中存储的值重叠。