2017-07-13 2 views
7

Ich möchte Indizes zu gruppieren Beobachtungen basierend auf zwei Spalten generieren. Aber ich möchte, dass Gruppen aus Beobachtungen gemacht werden, die mindestens eine Beobachtung in Gemeinsamkeiten teilen. Ich kann sehen, wie man Gruppen basierend auf Beobachtungen macht, die beide Beobachtungen gemeinsam haben, aber nicht nur eine davon.Machen Sie eine group_indices basierend auf mehreren Spalten

Zum Beispiel mit dem Datenrahmen:

dt <- data.frame(id=1:10, 
      G1 = c("A","A","B","B","C","C","C","D","E","F"), 
      G2 = c("Z","X","X","Y","W","V","U","s","T","T")) 

Ich möchte eine Spalte

1,1,1,1,2,2,2,3,4,4 

ich mit group_indices von dplyr versucht zu bekommen, aber haben es nicht geschafft.

Antwort

11

Mit IGRAPH get Mitgliedschaft, dann auf Namen Karte:

library(igraph) 

# convert to graph, and get clusters membership ids 
g <- graph_from_data_frame(df1[, c(2, 3, 1)]) 
myGroups <- components(g)$membership 

myGroups 
# A B C D E F Z X Y W V U s T 
# 1 1 2 3 4 4 1 1 1 2 2 2 3 4 

# then map on names 
df1$group <- myGroups[df1$G1] 


df1 
# id G1 G2 group 
# 1 1 A Z  1 
# 2 2 A X  1 
# 3 3 B X  1 
# 4 4 B Y  1 
# 5 5 C W  2 
# 6 6 C V  2 
# 7 7 C U  2 
# 8 8 D s  3 
# 9 9 E T  4 
# 10 10 F T  4 
+0

@akrun Dank, aber besorgt darüber, dass es nicht dplyr ist, und der Eingang wird sich ändern ... – zx8754

+0

Vielen Dank, diese Antwort scheint gut zu mir würde ich lieber eine Antwort haben, aber es ist trotzdem in Ordnung. Ich verstehe nicht, was Sie mit "Die Eingabe wird sich ändern" meinen: Wird Ihre Methode nicht mit anderen Daten arbeiten? – Malta

+0

@Malta wie wir nicht die realen Daten haben, kann ich nicht sagen, wenn Ihre Daten ähnlich zu Ihrem Beispiel sind, dann sollte alles wie erwartet funktionieren. – zx8754

Verwandte Themen