dplyr按多个列的并集分组
dplyr按多个列的并集分组,r,dplyr,R,Dplyr,dplyr可以通过多个列(比如ID列)进行分组,但这需要考虑它们的交叉点。因此,这些ID列的所有可用组合被认为是考虑不同组的因素。 我正在寻找多个列的并集,也就是说,如果两行至少有一个ID列匹配,我希望它们位于同一个组中 在中,有一个使用igraph包的解决方案。当我有两个以上的ID列时,我无法概括这一点,因为graph\u from\u data\u frame的文档说明如下: d 在前两列中包含符号边缘列表的数据帧。其他列被视为边属性 下面是一个例子: 库(dplyr) #> #>正在附加
dplyr
可以通过多个列(比如ID列)进行分组,但这需要考虑它们的交叉点。因此,这些ID列的所有可用组合被认为是考虑不同组的因素。
我正在寻找多个列的并集,也就是说,如果两行至少有一个ID列匹配,我希望它们位于同一个组中
在中,有一个使用igraph
包的解决方案。当我有两个以上的ID列时,我无法概括这一点,因为graph\u from\u data\u frame
的文档说明如下:
d
在前两列中包含符号边缘列表的数据帧。其他列被视为边属性
下面是一个例子:
库(dplyr)
#>
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#>
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#>
#>相交、setdiff、setequal、并集
输入数据:10 x 3
#>id1 id2 id3
#>
#> 1 1 1 1
#> 2 2 2 2
#> 3 3 3 2
#> 4 4 1 1
#> 5 5 2 2
#> 6 2 3 3
#> 7 2 3 4
#> 8 3 2 2
#> 9 4 4 5
#> 10 1 1 5
分组单位df%
分组依据(id1、id2、id3)%>%
变异(id=group_index())
分组的
#>#tibble:10 x 4
#>#分组:id1、id2、id3[10]
#>id1 id2 id3 id
#>
#> 1 1 1 1 1
#> 2 2 2 2 3
#> 3 3 3 2 7
#> 4 4 1 1 8
#> 5 5 2 2 10
#> 6 2 3 3 4
#> 7 2 3 4 5
#> 8 3 2 2 6
#> 9 4 4 5 9
#> 10 1 1 5 2
预期值:10 x 4
#>id1 id2 id3 id
#>
#> 1 1 1 1 1
#> 2 2 2 2 2
#> 3 3 3 2 2
#> 4 4 1 1 1
#> 5 5 2 2 2
#> 6 2 3 3 2
#> 7 2 3 4 2
#> 8 3 2 2 2
#> 9 4 4 5 1
#> 10 1 1 5 1
由(v0.2.1)于2019-05-03创建,您可以使用
rdist::pdist
创建邻接矩阵,从而应用igraph
方法:
library(rdist)
library(igraph)
matches = rdist::pdist(input_df, metric = function(x, y) { any(x == y) })
g = graph_from_adjacency_matrix(matches)
input_df$g = clusters(g)$membership
由于需要使用自定义函数计算成对距离,因此在较大的数据上可能速度较慢。我不确定是否理解预期的输出。第2行属于第2组,因为它与第1组中的任何内容都不匹配,第3行也属于第2组,因为它与第2组有1个匹配?那么第7行呢?您不能唯一地标识这样一个组,因为它们不会相互排斥。这似乎是一个群集问题。@第7行的Marius
id1
和id2
与第2行的匹配,因此ii被排除在同一个组中。@Rohit对于这个特定的伪示例,它们是独占的。这确实是一种集群,我同意这一点。我希望有一个dplyr
解决方案,但它也很好。谢谢