Gibt es eine Möglichkeit, Datenrahmen (linker äußerer Join) durch mehrere Spalten zusammenzuführen, aber mit ODER-Bedingung?linker äußerer Join in R mit Bedingungen
Beispiel: Es gibt zwei Datenrahmen df1
und df2
mit Säulen x, y, num
. Ich hätte gerne einen Datenrahmen mit allen Zeilen von df1
, aber nur mit den Zeilen von df2
, die die Bedingungen erfüllen: df1$x == df2$x
OR df2$y == df2y
.
Hier sind Beispieldaten:
df1 <- data.frame(x = LETTERS[1:5],
y = 1:5,
num = rnorm(5), stringsAsFactors = F)
df1
x y num
1 A 1 0.4209480
2 B 2 0.4687401
3 C 3 0.3018787
4 D 4 0.0669793
5 E 5 0.9231559
df2 <- data.frame(x = LETTERS[3:7],
y = 3:7,
num = rnorm(5), stringsAsFactors = F)
df2$x[4] <- NA
df2$y[3] <- NA
df2
x y num
1 C NA -0.7160824
2 <NA> 4 -0.3283618
3 E 5 -1.8775298
4 F 6 -0.9821082
5 G 7 1.8726288
Dann wird das Ergebnis zu erwarten sein:
x y num x y num
1 A 1 0.4209480 <NA> NA NA
2 B 2 0.4687401 <NA> NA NA
3 C 3 0.3018787 C NA -0.7160824
4 D 4 0.0669793 <NA> 4 -0.3283618
5 E 5 0.9231559 E 5 -1.8775298
Die naheliegendste Lösung ist die sqldf
Paket zu verwenden:
mergedData <- sqldf::sqldf("SELECT * FROM df1
LEFT OUTER JOIN df2
ON df1.x = df2.x
OR df1.y = df2.y")
Leider ist diese einfache Lösung extrem langsam und es wird ewig dauern, Datenrahmen mit m zu verschmelzen Erz als 100k Reihen jeder.
Eine weitere Option ist das Aufteilen des richtigen Datenrahmens und das Zusammenführen nach Teilen, aber gibt es dort eine elegantere oder gar "out of the box" Lösung?
Warum der Downvote? Dies ist eine gut geschriebene Frage. –
Ich habe es nicht heruntergestimmt, aber es klingt wie Sie eine funktionierende Lösung haben und Sie wollen nur herausfinden, wie man es schneller macht. Dies ist der Fall, diese Frage wäre besser geeignet für http://codereview.stackexchange.com –
@ Hack-R nicht zustimmen: Code Überprüfung ist nicht (in erster Linie) zur Verbesserung der Leistung, es ist für die Verbesserung der * Code-Qualität *. Die Frage, wie sie ist, ist perfekt für Stack Overflow geeignet: Es gibt ein technisches Problem, das gelöst werden muss. –