R:将具有重叠元素的组合

时间:2017-01-13 10:10:22

标签: r

我有一个包含组ID及其成员的数据框。我想将所有共享成员的小组合并。

为了说明,我可能会有这样的事情:

data.frame(group  = c("a", "a", "b", "b", "c", "c"),
           member = c( 1,   2,   2,   3,   4,   5))

这里,a和b组属于一个较大的组,因为它们共享成员2.我想为这些大组添加一个标识符,以便最终得到类似的结果:

data.frame(largeg = c("A", "A", "A", "A", "B", "B"),
           group  = c("a", "a", "b", "b", "c", "c"),
           member = c( 1,   2,   2,   3,   4,   5))

如何在R中实现此功能?在magrittr链中工作的解决方案将是非常棒的。但这不是必要条件。

(我不关心标识符是什么样的。它们都可以是数字,我只是用大写字母,小写字母和数字来澄清事情。)

1 个答案:

答案 0 :(得分:1)

如果您将数据视为图形,则可以看到较小的组如果通过成员连接则属于同一个大组。 igraph包可以解决此问题(df是您原来的data.frame):

require(igraph)
df$largeg<-components(graph_from_data_frame(df))$membership[df$group]
#  group member largeg
#1     a      1      1
#2     a      2      1
#3     b      2      1
#4     b      3      1
#5     c      4      2
#6     c      5      2

您当然可以更改largeg之后的名称。

作为可以添加到magrittr链的函数:

FindComponents <- function(df, group, id) {
  df <- df[, c(group, id)]
  gr <- graph_from_data_frame(df)
  as.vector(components(gr)$membership[df[[group]]])
}

用法:

df %>%
  mutate(largeg = FindComponents(., 'group', 'id'))