我有一个包含组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链中工作的解决方案将是非常棒的。但这不是必要条件。
(我不关心标识符是什么样的。它们都可以是数字,我只是用大写字母,小写字母和数字来澄清事情。)
答案 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'))