首页 > 解决方案 > 如果它们不与 dplyr 不相交,如何合并两个不同的分组

问题描述

假设我有两组标识符id1id2在一个数据框中。如何创建一个新的标识符id3,其工作方式如下:

我认为id1是更严格的关键,因此观察首先被分组id1,然后在id2. 如果有两组具有不同值的行,id2其中某些元素具有相同的id1,则这两组应该具有相同的值 for id3(确切的值id3无关紧要)。

 df <- data.frame(id1 = c(1, 1, 2, 2, 5, 6),
             id2 = c(4, 3, 1, 2, 2, 7),
             id3 = c(1, 1, 2, 2, 2, 3))

第 1 行和第 2 行组合在一起,因为它们具有相同的id1. 第 3、4 和 5 行被组合在一起,因为 3 和 4 具有相同的id14 和 5 具有相同的id2

有人可以帮忙吗?我宁愿有一个解决方案,dplyr它包含一个一般情况,其中列中有任意数量的可能值id

标签: rdplyr

解决方案


这是一个图论问题。每个id1id2都是一个单独的节点,并df给出了它们之间的链接。您正在查看每个 id 也属于哪些弱连接集群。

library(igraph)
df <- df %>% mutate(from = paste0('id1', '_', id1), to = paste0('id2', '_', id2))
dg <- graph_from_data_frame(df %>% select(from, to), directed = FALSE)
df <- df %>% mutate(id3 = components(dg)$membership[from])
df %>% select(id1, id2, id3)

#>   id1 id2 id3
#> 1   1   4   1
#> 2   1   3   1
#> 3   2   1   2
#> 4   2   2   2
#> 5   5   2   2
#> 6   6   7   3

推荐阅读