2017-07-17 5 views
0

sagen, dass ich zwei Datenrahmen haben:Besondere kommen in R-Datenrahmen

df1<- data.frame(id1=c('A','B','C','D','P'), 
       id2=c('P','H','Q','S','A'),weight=c(3,4,2,7,3), stringsAsFactors=FALSE) 

df2<- data.frame(id1=c('A','H','Q','D','P'), 
       id2=c('P','B','C','S','Z'),var=c(2,1,2,2,1), stringsAsFactors=FALSE) 

Ich möchte diese beiden Datenrahmen von id1 und id2 beitreten, aber manchmal werden die Datensätze in beiden Tabellen geschaltet. Zum Beispiel sollte die zweite und dritte Aufzeichnung jedes Rahmens gleich sein und die Ausgabe in der fusionierten Tabelle sein soll:

B H 4 1 
C Q 2 2 

Ich dachte zuerst die Spalten sortieren und tun, um die Zusammenführung aber dieser Ansatz nicht funktioniert, weil Nicht alle Datensätze erscheinen in beiden Tabellen (auch nach dem Sortieren können Sie id1 und id2 geschaltet haben). Dies ist ein Spielzeugbeispiel, aber in der tatsächlichen Anwendung sind id1 und id2 lange Zeichenfolgen.

Was ist ein Weg, um diese Aufgabe zu bewältigen?

Antwort

2

Hier eine Lösung durch Erstellen einer Zwischen-Spalte, die beide IDs in einer sortierten Weise kombinieren.

df1$key <- with(df1,mapply(function(x,y){ 
    paste(sort(c(x,y)),collapse="") 
    },id1,id2)) 

df2$key <- with(df2,mapply(function(x,y){ 
    paste(sort(c(x,y)),collapse="") 
},id1,id2)) 

merge(df1,df2,by="key") 

# key id1.x id2.x weight id1.y id2.y var 
# 1 AP  A  P  3  A  P 2 
# 2 AP  P  A  3  A  P 2 
# 3 BH  B  H  4  H  B 1 
# 4 CQ  C  Q  2  Q  C 2 
# 5 DS  D  S  7  D  S 2 
+2

Standard Lösung hierfür ist die Verwendung 'paste0 (pmin (ID1, ID2), pmax (ID1, ID2))' statt einer pro-Zeile sort – eddi

+0

@eddi guter. – agstudy