2016-06-28 9 views
-1

Ich habe zwei Datenrahmen, Link- und Körper:Kombinieren von zwei Datenrahmen mit unterschiedlicher Anzahl von Zeilen in R

Link wie folgt ist:

wpt  ID 
1   1235 
mediate 4562 
mediate 0928 
2   6351 
3   3826 
mediate 0835 

Körper ist wie folgt:

wpt fuel distance 
1  2221 53927 
2  4821 48261 
3  8362 47151 

Der Ausgang i wie dies zu erwarten ist:

wpt  fuel distance ID 
1  2221 53927  1235 
mediate NA  NA   4562 
mediate NA  NA   0928 
2  4821 48261  6351 
3  8362 47151  3826 
mediate NA  NA   0835 

Ich habe versucht, mit "merge" -Funktion, nicht funktioniert. Angenommen, die Zeilennummer von "mediate" als Index zum Aufteilen von "body" und rbind sie Stück für Stück könnte funktionieren. Gibt es einen schöneren Weg? Kann jemand hier helfen?

Vielen Dank im Voraus!

+1

Wenn 'merge' nicht funktioniert, würde ich es erneut versuchen, weil es ein typisches scheint 'Verschmelzen' Problem zu mir. – Psidom

+0

'merge (link, body, all = TRUE)' – alistaire

+0

Ich denke nicht, ich möchte die Zeilen mit "vermitteln" in genau der gleichen Position. Während der Zusammenführung werden sie automatisch zusammengefügt. –

Antwort

2
df1 <- data.frame(wpt = c(1, "meditate", "meditate", 2,3,"meditate"), 
       ID = c(1235, 4562, 0928,6351,3826,0835)) 
df1$wpt <- as.character(df1$wpt) 


df2 <- data.frame(wpt = c(1,2,3), 
       fuel = c(1235, 4562, 0928), 
       distance = c(2,3,4)) 
df2$wpt <- as.character(df2$wpt) 


library(dplyr) 
full_join(df1, df2, by = "wpt") 

Stört die Werte nicht! Sie können die Spalten immer neu anordnen.

 wpt ID fuel distance 
1  1 1235 1235  2 
2 meditate 4562 NA  NA 
3 meditate 928 NA  NA 
4  2 6351 4562  3 
5  3 3826 928  4 
6 meditate 835 NA  NA 
+0

Art Erinnerung daran, dass ich die Zeilen mit "vermitteln" in der genauen Position, wie ich in der Frage angegeben habe. Oder dies könnte mit nur Merge-Funktion erfolgen. –

+0

Bitte überprüfen Sie meine Bearbeitung. Die meditativen Werte befinden sich in der von Ihnen gewünschten Position. – Sumedh

1

Wir verwenden left_join

library(dplyr) 
mutate(df2, wpt = as.character(wpt)) %>% 
        left_join(df1, ., by = 'wpt') 
#  wpt ID fuel distance 
#1  1 1235 2221 53927 
#2 mediate 4562 NA  NA 
#3 mediate 928 NA  NA 
#4  2 6351 4821 48261 
#5  3 3826 8362 47151 
#6 mediate 835 NA  NA 

Oder mit data.table

library(data.table) 
setDT(df2)[, wpt := as.character(wpt)][df1, on = "wpt"] 
#  wpt fuel distance ID 
#1:  1 2221 53927 1235 
#2: mediate NA  NA 4562 
#3: mediate NA  NA 928 
#4:  2 4821 48261 6351 
#5:  3 8362 47151 3826 
#6: mediate NA  NA 835 
+1

Danke für die Eingabe! –

2

Ich denke, im Anschluss an die Arbeit sollte:

library(data.table) 
setkey(link,wpt) 
setkey(body,wpt) 
merge(link,body,by="wpt",all.x=T) 
Hier
+0

'setkey' ist eine' data.table' Funktion. Sie brauchen 'library (data.table)' – JackeJR

+0

Richtig brauchen Sie data.table – Koba

+0

Gut zu wissen, andere Methode! –

3

ist eine nicht-merge Basis R Lösung gebaut um match():

link[names(body)[-1L]] <- body[match(link[,1L],body[,1L]),-1L]; 
link; 
##  wpt ID fuel distance 
## 1  1 1235 2221 53927 
## 2 mediate 4562 NA  NA 
## 3 mediate 0928 NA  NA 
## 4  2 6351 4821 48261 
## 5  3 3826 8362 47151 
## 6 mediate 0835 NA  NA 

Daten

link <- data.frame(wpt=c('1','mediate','mediate','2','3','mediate'),ID=c('1235','4562','0928' 
,'6351','3826','0835'),stringsAsFactors=F); 
body <- data.frame(wpt=c(1L,2L,3L),fuel=c(2221L,4821L,8362L),distance=c(53927L,48261L,47151L) 
); 
+1

Wenn ich vorschlagen könnte, verschieben Sie diese Antwort zu dupen Ziel. – zx8754