Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr按多个列的并集分组_R_Dplyr - Fatal编程技术网

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
解决方案,但它也很好。谢谢