如何在 R dplyr 中对互连元素进行分组

How to group interconnected elements in R dplyr

我有一个看起来像这样的数据框。 col1 中的元素与 col2 中的元素间接连接。 例如 1 与 2 和 3 相连。 并且2与3相连。因此1也应该与3相连。

library(tidyverse)

df1 <- tibble(col1=c(1,1,2,5,5,6), 
              col2=c(2,3,3,6,7,7))
df1
#> # A tibble: 6 × 2
#>    col1  col2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     1     3
#> 3     2     3
#> 4     5     6
#> 5     5     7
#> 6     6     7

reprex package (v2.0.1)

于 2022-03-15 创建

我希望我的数据看起来像这样

#>    col1  col2  col3
#>   <dbl> <dbl>
#> 1     1     2  group1
#> 2     1     3  group1
#> 3     2     3  group1
#> 4     5     6  group2
#> 5     5     7  group2
#> 6     6     7  group2

如果能帮助我解决这个谜语,我将不胜感激。 谢谢你的时间

我们可以用igraph

library(igraph)
library(dplyr)
library(stringr)
g <- graph.data.frame(df1, directed = TRUE)
df1 %>% 
   mutate(col3 = str_c("group", clusters(g)$membership[as.character(col1)]))

-输出

# A tibble: 6 × 3
   col1  col2 col3  
  <dbl> <dbl> <chr> 
1     1     2 group1
2     1     3 group1
3     2     3 group1
4     5     6 group2
5     5     7 group2
6     6     7 group2

另一个igraph选项

df1 %>%
    mutate(
        col3 =
            paste0("group", {
                graph_from_data_frame(.) %>%
                    components() %>%
                    membership()
            }[as.character(col1)])
    )

给予

# A tibble: 6 x 3
   col1  col2 col3  
  <dbl> <dbl> <chr>
1     1     2 group1
2     1     3 group1
3     2     3 group1
4     5     6 group2
5     5     7 group2
6     6     7 group2