r - 如果它们不与 dplyr 不相交,如何合并两个不同的分组
问题描述
假设我有两组标识符id1
并id2
在一个数据框中。如何创建一个新的标识符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 具有相同的id1
4 和 5 具有相同的id2
。
有人可以帮忙吗?我宁愿有一个解决方案,dplyr
它包含一个一般情况,其中列中有任意数量的可能值id
。
解决方案
这是一个图论问题。每个id1
和id2
都是一个单独的节点,并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
推荐阅读
- jsf - 为什么 convertDateTime 不支持 Instant
- javascript - Cloud HTTPS 函数:返回一个 Promise 中的 Promise
- excel - 删除 Excel 工作表中重复行的宏不起作用
- javascript - 如何在 reactJS 中使用 Lodash 或 JS 在 JSON 中动态添加键值对?
- html - CSS background-image 在移动浏览器上被扭曲和放大
- python - 将字典转换为列表列表
- python - Tensorflow 2.1 错误“在完成 GeneratorDataset 迭代器时” - 可能是我的生成器中的内存泄漏,但如何缩小范围?
- java - Spring Boot 2.2.5 - yaml 中的 spring.datasource.data 属性
- php - Laravel - 方法 Illuminate\Http\Request::request 不存在
- r - r散点图中的不同绘图符号