2017-01-13 5 views
0

私はグループIDとそのメンバーを持つデータフレームを持っています。メンバーを共有するすべてのグループを結合したいと思います。彼らは部材2を共有するので、私は、これらの大規模なグループのための識別子を追加したい、そしてbは、より大きなグループに属している。ここR:重複する要素とグループを結合する

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

、グループ:

は、私がこのような何かを持っているかもしれませんが、説明するために、私は次のようなものになります:

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の名前を変更することができます。

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チェーンに追加することができる機能として


。問題のグラフの性質を指摘していただきありがとうございます。あなたの答えにmagrittr/dplyr連鎖機能を追加する自由を取った。 – severin

+0

喜んで助けました。私はあなたの編集を受け入れました。 – nicola

関連する問題