2017-01-13 153 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