2017-01-13 2 views
0

Ich habe ein Datenframe mit Gruppen-IDs und ihre Mitglieder. Ich möchte alle Gruppen, die ein Mitglied teilen, kombinieren.R: Kombinieren Sie Gruppen mit überlappenden Elementen

Zur Veranschaulichung ich so etwas wie dieses haben könnte:

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

Hier Gruppen zu einer größeren Gruppe a und b gehören, weil sie Mitglied teilen 2. Ich möchte eine Kennung für diese großen Gruppen hinzufügen so dass ich am Ende mit etwas enden würde:

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)) 

Wie kann ich über die Implementierung dieses in R gehen? Eine Lösung, die in einer Magristr-Kette funktioniert, wäre großartig. Aber es ist keine Voraussetzung.

(ist mir egal, was die Kennungen aussehen. Sie sind alle Zahlen sein können, habe ich nur Großbuchstaben, Kleinbuchstaben und Zahlen hier, um die Dinge zu klären.)

Antwort

1

Wenn Sie Ihre Daten denken als In einem Diagramm sehen Sie, dass kleinere Gruppen zu derselben großen Gruppe gehören, wenn sie über ein Mitglied verbunden sind. Das igraph Paket kann dieses Problem lösen (df ist Ihre ursprüngliche 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 

Sie natürlich die Namen der largeg nach ändern.


Als eine Funktion, die zu einer magrittr Kette hinzugefügt werden können:

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

Verbrauch:

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

Das ist genau das, was ich suchte. Danke, dass Sie auf die Graph-Natur des Problems hingewiesen haben. Ich habe mir die Freiheit genommen, Ihrer Antwort eine kaskadierbare Funktion hinzuzufügen. – severin

+0

Froh, dass es geholfen hat. Ich habe deine Bearbeitung akzeptiert. – nicola

Verwandte Themen