繁体   English   中英

dplyr按多个列进行分组

[英]dplyr group by union of multiple columns

dplyr可以按多个列分组(比方说ID列),但这要考虑它们的交集。 因此,这些ID列的所有可用组合均被视为考虑不同组的因素。

我正在寻找多列的并集,即如果两行至少由ID列之一匹配,我希望它们位于同一组中。

该线程中 ,有一个使用igraph包的解决方案。 当我有两个以上的ID列时,我无法一概而论,因为graph_from_data_frame的文档说:

d

在前两列中包含符号边缘列表的数据框。 附加列被视为边属性。

这是一个例子:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

input_df <- tibble(id1 = c(1, 2, 3, 4, 5, 2, 2, 3, 4 ,1),
                   id2 = c(1, 2, 3, 1, 2, 3, 3, 2, 4, 1),
                   id3 = c(1, 2, 2, 1, 2, 3, 4, 2, 5, 5))
input_df
#> # A tibble: 10 x 3
#>      id1   id2   id3
#>    <dbl> <dbl> <dbl>
#>  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

grouped_df <- input_df %>%
  group_by(id1, id2, id3) %>%
  mutate(id = group_indices())
grouped_df
#> # A tibble: 10 x 4
#> # Groups:   id1, id2, id3 [10]
#>      id1   id2   id3    id
#>    <dbl> <dbl> <dbl> <int>
#>  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

expected_df <- bind_cols(input_df,
                         id = c(1, 2, 2, 1, 2, 2, 2, 2, 1, 1))
expected_df
#> # A tibble: 10 x 4
#>      id1   id2   id3    id
#>    <dbl> <dbl> <dbl> <dbl>
#>  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

reprex软件包 (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

由于需要使用自定义函数计算成对距离,因此对于较大的数据可能会变慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM