Ich habe eine data.table :
groups <- data.table(group = c("A", "B", "C", "D", "E", "F", "G"),
code_1 = c(2,2,2,7,8,NA,5),
code_2 = c(NA,3,NA,3,NA,NA,2),
code_3 = c(4,1,1,4,4,1,8))
group code_1 code_2 code_3
A 2 NA 4
B 2 3 1
C 2 NA 1
D 7 3 4
E 8 NA 4
F NA NA 1
G 5 2 8
Was ich erreichen möchte, ist, dass jede Gruppe anhand der verfügbaren Codes die unmittelbaren Nachbarn findet. Beispiel: Gruppe A hat aufgrund von Code_1 unmittelbare Nachbargruppen B, C (Code_1 ist in allen Gruppen gleich 2) und aufgrund von Code_3 unmittelbare Nachbargruppen D, E (Code_3 ist in allen diesen Gruppen gleich 4).
Ich habe versucht, für jeden Code die erste Spalte (Gruppe) basierend auf den Übereinstimmungen wie folgt zu unterteilen:
groups$code_1_match = list()
for (row in 1:nrow(groups)){
set(groups, i=row, j="code_1_match", list(groups$group[groups$code_1[row] == groups$code_1]))
}
group code_1 code_2 code_3 code_1_match
A 2 NA 4 A,B,C,NA
B 2 3 1 A,B,C,NA
C 2 NA 1 A,B,C,NA
D 7 3 4 D,NA
E 8 NA 4 E,NA
F NA NA 1 NA,NA,NA,NA,NA,NA,...
G 5 2 8 NA,G
Das "irgendwie" funktioniert, aber ich würde annehmen, dass es eine Art Datentabelle gibt, wie man das macht. Ich habe es versucht
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Das funktioniert aber nicht.
Vermisse ich einen offensichtlichen Datentabellentrick, um damit umzugehen?
Mein ideales Fallergebnis würde folgendermaßen aussehen (was derzeit die Verwendung meiner Methode für alle drei Spalten und die anschließende Verkettung der Ergebnisse erfordern würde):
group code_1 code_2 code_3 Immediate neighbors
A 2 NA 4 B,C,D,E
B 2 3 1 A,C,D,F
C 2 NA 1 A,B,F
D 7 3 4 B,A
E 8 NA 4 A,D
F NA NA 1 B,C
G 5 2 8
quelle
igraph
, die wirklich interessant sein könnte.Antworten:
Holen Sie sich mit igraph Nachbarn 2. Grades, löschen Sie numerische Knoten und fügen Sie die verbleibenden Knoten ein.
Mehr Info
So sehen unsere Daten vor der Konvertierung in ein igraph-Objekt aus. Wir möchten sicherstellen, dass sich Code1 mit Wert 2 von Code2 mit Wert 2 usw. unterscheidet.
So sieht unser Netzwerk aus:
Beachten Sie, dass
A..G
Knoten immer durch verbunden sindcode_x_y
. Wir müssen also den 2. Grad erhalten,ego(..., order = 2)
geben uns Nachbarn bis einschließlich Nachbarn 2. Grades und geben ein Listenobjekt zurück.So erhalten Sie die Namen:
Um das Ergebnis zu verschönern, müssen wir
code_x_y
Knoten und den Ursprungsknoten (1. Knoten) entfernen.quelle
Es gibt wahrscheinlich einen praktischeren Weg, dies zu erreichen, aber Sie könnten so etwas tun, indem Sie Schmelzen und Verknüpfungen verwenden:
quelle
Dies ist inspiriert von @ sindri_baldurs Schmelze. Diese Lösung:
quelle
Wie von zx8754 erwähnt,
data.table::melt
mitcombn
und dannigraph::as_adjacency_matrix
Ausgabe:
oder ohne zu benutzen
igraph
Ausgabe:
quelle
xtabs
eine ähnliche Ausgabe wie derigraph
Schritt erstellen ?table
oderxtabs