假设我有两套标识符id1
,并id2
在数据帧。如何创建一个新的标识符id3
,其工作方式如下:
我认为id1
这是更严格的密钥,因此,观察值首先要分组在中id1
,然后再分组在中id2
。如果存在两组值不同的行id2
,其某些元素具有相同的id1
,则这两组值应具有相同的值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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句