2017-01-13 59 views
0

我有一个数据框与组ID和他们的成员。我想结合共享成员的所有组。R:联合组与重叠元素

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

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

如果你认为你的数据一个图形,你会发现如果小组通过一个成员连接,它们就属于同一个大组。该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')) 
+1

这正是我一直在寻找。感谢您指出问题的图形性质。我冒昧给您的答案添加magrittr/dplyr可链接功能。 – severin

+0

很高兴帮助。我接受了你的修改。 – nicola