Ich versuche herauszufinden, wie man eine R-Datentabelle basierend auf der Verkettung von 2 Spalten bestellt.
Hier ist meine Beispieldatentabelle.
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A')
, col1 = c(7521, 0, 7915, 5222, 5703)
, col2 = c(7907, 5703, 8004, 7521, 5222))
id col1 col2
1: A 7521 7907
2: A 0 5703
3: A 7915 8004
4: A 5222 7521
5: A 5703 5222
Ich brauche die Zeilenreihenfolge, um mit col1 = 0 zu beginnen. Der Wert für col1 in Zeile 2 sollte gleich dem Wert von col2 in der vorhergehenden Zeile sein und so weiter.
Außerdem sollte es im Allgemeinen immer einen übereinstimmenden Wert geben, der die Zeilenreihenfolge verkettet. Wenn nicht, sollte der nächstgelegene Wert ausgewählt werden (siehe Zeilen 4 und 5 unten).
Das gesuchte Ergebnis ist unten dargestellt:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
Ich denke, ich kann eine verrückte Funktion schreiben, um dies zu tun. Aber ich frage mich, ob es eine elegante data.table-Lösung gibt.
BEARBEITEN
Ich habe die Tabelle aktualisiert, um eine zusätzliche ID mit doppelten Zeilen und eine eindeutige Quellenspalte aufzunehmen:
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B')
, col1 = c(7521, 0, 7915, 5222, 5703, 1644, 1625, 0, 1625, 1625)
, col2 = c(7907, 5703, 8004, 7521, 5222, 1625, 1625, 1644, 1625, 1505)
, source = c('c', 'b', 'a', 'e', 'd', 'y', 'z', 'x', 'w', 'v'))
id col1 col2 source
1: A 7521 7907 c
2: A 0 5703 b
3: A 7915 8004 a
4: A 5222 7521 e
5: A 5703 5222 d
6: B 1644 1625 y
7: B 1625 1625 z
8: B 0 1644 x
9: B 1625 1625 w
10: B 1625 1505 v
Innerhalb einer ID können übereinstimmende Werte vorhanden sein. Siehe B, Zeilen 7 und 9 oben. Es gibt jedoch eine eindeutige Quelle für jede Zeile, aus der diese Daten stammen.
Die gewünschte Ausgabe wäre:
id col1 col2 source
1: A 0 5703 b
2: A 5703 5222 d
3: A 5222 7521 e
4: A 7521 7907 c
5: A 7915 8004 a
6: B 0 1644 x
7: B 1644 1625 y
8: B 1625 1625 w
9: B 1625 1625 z
10: B 1625 1625 v
In der Ausgabe können die übereinstimmenden Zeilen 8 und 9 in beliebiger Reihenfolge sein.
Vielen Dank!
quelle
col2
Duplikate in einer ID? Ihr Beispiel würde so funktionieren, wie es ist, aber wenn es weitere Zeilen gibt,col2
wäre dies entweder 1625 oder eine Nichtübereinstimmung.Antworten:
Hier ist ein anderer Ansatz, der:
col2
Übereinstimmungen zurückzugebencol1
.Wenn Sie dies mit Gruppierung tun, können Sie die Schleife in a einschließen
dt[, .I[{...}, by = id]$V1
, um die Indizes zurückzugeben. Oder damit es besser aussieht, können wir eine Funktion erstellen.quelle
Hier ist eine Option
igraph
mitdata.table
:Ausgabe:
Daten:
quelle
col*