按相交向量分组
Group by intersecting vectors
考虑这个 tibble
:
tibble(id = list(c(1, 2), c(3, 4, 7), c(3, 5), 10, c(5, 6)))
id
<list>
1 <dbl [2]>
2 <dbl [3]>
3 <dbl [2]>
4 <dbl [1]>
5 <dbl [2]>
如果一行中的一个或多个值也在另一行中,我想分组 id
。这里,第一行是1 2
,其他行都没有出现1和2,所以它是唯一分配的group == 1
。与第4行相同。第2、3和5行共享数字3(第2和3行)和第5行(第3和5行),然后它们都分配到同一组。
预期输出:
# A tibble: 5 x 2
id group
<list> <dbl>
1 <dbl [2]> 1
2 <dbl [3]> 2
3 <dbl [2]> 2
4 <dbl [1]> 3
5 <dbl [2]> 2
关于如何做到这一点有什么想法吗?也许 igraph
?
library(tidyverse)
library(igraph)
df %>%
mutate(rn = paste0('node', row_number()))%>%
left_join(unnest(., id) %>%
graph_from_data_frame(dir = FALSE) %>%
components() %>%
getElement('membership')%>%
enframe('rn', 'group'))
# A tibble: 5 x 3
id rn group
<list> <chr> <dbl>
1 <dbl [2]> node1 1
2 <dbl [3]> node2 2
3 <dbl [2]> node3 2
4 <dbl [1]> node4 3
5 <dbl [2]> node5 2
考虑这个 tibble
:
tibble(id = list(c(1, 2), c(3, 4, 7), c(3, 5), 10, c(5, 6)))
id
<list>
1 <dbl [2]>
2 <dbl [3]>
3 <dbl [2]>
4 <dbl [1]>
5 <dbl [2]>
如果一行中的一个或多个值也在另一行中,我想分组 id
。这里,第一行是1 2
,其他行都没有出现1和2,所以它是唯一分配的group == 1
。与第4行相同。第2、3和5行共享数字3(第2和3行)和第5行(第3和5行),然后它们都分配到同一组。
预期输出:
# A tibble: 5 x 2
id group
<list> <dbl>
1 <dbl [2]> 1
2 <dbl [3]> 2
3 <dbl [2]> 2
4 <dbl [1]> 3
5 <dbl [2]> 2
关于如何做到这一点有什么想法吗?也许 igraph
?
library(tidyverse)
library(igraph)
df %>%
mutate(rn = paste0('node', row_number()))%>%
left_join(unnest(., id) %>%
graph_from_data_frame(dir = FALSE) %>%
components() %>%
getElement('membership')%>%
enframe('rn', 'group'))
# A tibble: 5 x 3
id rn group
<list> <chr> <dbl>
1 <dbl [2]> node1 1
2 <dbl [3]> node2 2
3 <dbl [2]> node3 2
4 <dbl [1]> node4 3
5 <dbl [2]> node5 2