2016-09-09 5 views
0

Ich habe zwei data.frame df1 und df2.R zwei Tabelle Merge

df1=data.frame(id=c(1,2,2),var1=c(3,5,5),var3=c(2,3,4)) 
df2=data.frame(id=c(1,1,2,2),var1=c('NONE','NONE','NONE','NONE'),var3=c(2,4,6,5)) 

jetzt möchte ich zu einem data.frame zusammenführen. Zuerst sollte ich die df2$var1 ändern. Er codiert die df2$var1 mit df1$var1, wenn df2$id mit df1$id übereinstimmen. Zum Beispiel df1$id=1df1$var1=3 dann df2$id=1 und df2$var1=3, so sollte das Ergebnis dieser mag:

df1=data.frame(id=c(1,2,2),var1=c(3,5,5),var3=c(2,3,4)). 
df2=data.frame(id=c(1,1,2,2),var1=c(3,3,5,5),var3=c(2,4,6,5)) 

zweitens möchte ich zwei data.frame fusionieren und die gleiche one.the Ergebnis löschen sollte dies mag:

df=data.frame(id=c(1,1,2,2,2,2),var1=c(3,3,5,5,5,5),var2=c(2,4,3,4,6,5)) 

Entschuldigung, es ist meine erste, Stackoverflow zu verwenden. Und am wichtigsten ist Englisch nicht meine Muttersprache.


+0

'einzigartig (rbind (DF1, fusionieren (df1 [, - 3], DF2 [- 2], durch = 'id')))' – alistaire

+0

ich glaube, es ist ein kleiner Fehler im Beispiel des Ergebnisses, das du gegeben hast. @HubertL und ich haben beide ein unterschiedliches Ergebnis für die 3. Spalte der 3. und 4. Reihe. –

Antwort

2
library(dplyr) 
union_all(df1, df2) %>% 
    distinct() %>% 
    arrange(id, var1) 

    id var1 var3 
1 1 3 2 
2 1 3 4 
3 2 5 3 
4 2 5 4 
5 2 5 6 
6 2 5 5 

Zuerst verwende ich dplyr :: Union, dann fand ich, dass die Ordnung gestört wird. So schließlich verwende ich union_all, dann ordnen sie

+1

Benötigen Sie eine Erklärung in der Antwort –

+0

Das ist eine Menge Code, um dieses Ergebnis zu erreichen. Frühere Antworten waren prägnanter und führten keine neue Paketabhängigkeit ein ... –

1

Ich denke, das ist, was Sie wollen.

library(sqldf) 
sqldf("select b.id, a.var1, b.var3 from df1 a left join df2 b on a.id = b.id") 
id var1 var3 
1 1 3 2 
2 1 3 4 
3 2 5 5 
4 2 5 6 
5 2 5 5 
6 2 5 6 

Dies ist das gleiche wie das Beispiel, das Sie von Ihrem gewünschten Ergebnis führte, mit Ausnahme der dritten Spalte der 3. und 4. Reihe. Ich glaube, das liegt an einem Tippfehler in Ihrem Beispiel, aber wenn ich mich diesbezüglich täusche, lassen Sie es mich bitte wissen (und erklären Sie einfach, warum diese Werte anders sind und ich werde meine Antwort entsprechend aktualisieren).

Übrigens gibt es mehrere Möglichkeiten, dies zu tun, aber ich finde, dass dieses schnell und einfach ist.

0

mit merge:

df2$var1 <- df1[df2$id,'var1']; 
df2 
    id var1 var3 
1 1 3 2 
2 1 3 4 
3 2 5 6 
4 2 5 5 

df <- merge(df1, df2, by='id')[-2:-3] 
df 
    id var1.y var3.y 
1 1  3  2 
2 1  3  4 
3 2  5  6 
4 2  5  5 
5 2  5  6 
6 2  5  5