2016-05-24 13 views
0

Ich habe einen Datenrahmen wie folgt:Merge von zwei verschiedenen Spalten Ohne Berücksichtigung der Bestellung

df1: 

COL1  COL2 VALUE 
    A  B  1 
    A  C  1 
    A  F  1 
    A  D  1 
    B  E  1 

df2: 

ADV1  ADV2 VALUE2 
    B  A  1 
    A  C  1 
    B  E  1 
    D  A  1 

Das möchte ich den Auftrag für COL1 und COL2 außer Acht zu lassen, wenn ich es mit DF1 verschmelzen.

So wie Sie sehen können COL1: A und COL2: B nicht in DF1 auftreten, aber diese beiden Werte existieren in einer Zeile ... daher indexieren wir es. Es ist auch wichtig, die NA-Werte in df1 beizubehalten. Ich denke, es ist ein vollständiger Join, aber der Cache ist, dass ich die Reihenfolge von COL1 und COL2 ignorieren möchte und die Spaltennamen unterschiedlich sind.

COL1  COL2 VALUE VALUE2 
    A  B  1  1 
    A  C  1  1 
    A  F  1  NA 
    A  D  1  1 
    B  E  1  1 

Vielen Dank!

+0

Es ist nicht klar, was die Kriterien für die Zusammenführung/Beitritt in Ihrem Fall ist. Was meinst du mit Missachtung der Reihenfolge der Werte in Spalten? Warum gibt es NA in der Ausgabespalte VALUE2, die A, F entspricht? – Gopala

+0

Danke, habe gerade die Beschreibung der Frage geändert @Gopala –

Antwort

2

Eine Lösung ist eine ‚neue‘ Spalte zu erstellen, die die COL1/COL2 und ADV1/ADV2 vereint in einer sortierten Reihenfolge hat, und kommen auf der Grundlage dieser Spalte wie folgt:

library(dplyr) 
df1$NEWCOL <- paste(pmin(df1$COL1, df1$COL2), 
        pmax(df1$COL1, df1$COL2), 
        sep = '') 
df2$NEWCOL <- paste(pmin(df2$ADV1, df2$ADV2), 
        pmax(df2$ADV1, df2$ADV2), 
        sep = '') 
df <- left_join(df1, df2) 

resultierende Ausgang ist wie folgt:

COL1 COL2 VALUE NEWCOL ADV1 ADV2 VALUE2 
1 A B  1  AB B A  1 
2 A C  1  AC A C  1 
3 A F  1  AF <NA> <NA>  NA 
4 A D  1  AD D A  1 
5 B E  1  BE B E  1 

natürlich können Sie nicht benötigte Spalten entfernen, wie folgt:

df <- select(df, COL1, COL2, VALUE, VALUE2) 

Ausgabe wie folgt:

COL1 COL2 VALUE VALUE2 
1 A B  1  1 
2 A C  1  1 
3 A F  1  NA 
4 A D  1  1 
5 B E  1  1 

ich verwende left_join oben angegebenen die Eingangsdaten. Wenn es notwendig ist, beide Seiten zusammenzuführen, können Sie natürlich full_join stattdessen aus dem gleichen dplyr Paket verwenden.

+0

Der erste Teil: df1 $ NEWCOL hat nicht funktioniert. Dies ist passiert, als ich es ausgeführt habe: Warnmeldungen: 1: In Ops.factor (mmm, jeweils): '>' nicht sinnvoll für Faktoren 2: In Ops.factor (mmm, jeder): '<' nicht sinnvoll für Faktoren –

+0

Ja, Sie müssen die Daten mit 'stringsAsFactors = FALSE' lesen. Andernfalls wird es als Faktoren gelesen und im Allgemeinen mit Dingen vermischt. – Gopala

+0

Mache ich das am Anfang Ihrer Antwort? –

Verwandte Themen