2016-05-21 10 views
0

Ich möchte zwei Datenrahmen zusammenführen, wobei Zeilen basierend auf einem bestimmten Spaltenwert übersprungen werden, die übersprungenen Zeilen jedoch im endgültigen zusammengeführten Datenrahmen bleiben. Ich kann den ersten Teil (überspringen) verwalten, aber nicht den zweiten.R: Zusammenführen von Datenrahmen: Bestimmte Spaltenwerte ausschließen, aber übersprungene Zeilen ignorieren

Hier sind die Datenrahmen:

# Data frame 1 values 
ids1 <- c(1:3) 
x1 <- c(100, 101, 102) 
doNotMerge <- c(1, 0, 0) 

# Data frame 2 values 
ids2 <- c(1:3) 
x2 <- c(200, 201, 202) 

# Creating the data frames 
df1 <- as.data.frame(matrix(c(ids1, x1, doNotMerge), 
          nrow = 3, 
          ncol = 3, 
          dimnames = list(c(),c("ID", "X1", "DoNotMerge")))) 

df2 <- as.data.frame(matrix(c(ids2, x2), 
          nrow = 3, 
          ncol = 2, 
          dimnames = list(c(),c("ID", "X2")))) 

# df1 contents: 
# ID X1 DoNotMerge 
# 1 1 100   1 
# 2 2 101   0 
# 3 3 102   0 

# df2 contents: 
# ID X2 
# 1 1 200 
# 2 2 201 
# 3 3 202 

I merge verwendet:

merged <- merge(df1[df1$DoNotMerge != 1,], df2, by = "ID", all = T) 

# merged contents: 
# ID X1 DoNotMerge X2 
# 1 1 NA   NA 200 
# 2 2 101   0 201 
# 3 3 102   0 202 

Das Überspringen Teil ich tun konnte, aber was ich will eigentlich ist die df1 Reihe zu halten, wo DoNotMerge == 1 , so:

# ID X1 DoNotMerge X2 
# 1 1 NA   NA 200 
# 2 1 100   1 NA 
# 3 2 101   0 201 
# 4 3 102   0 202 

Kann jemand bitte helfen? Vielen Dank.

+1

Mögliche Duplikat [Merge Datensätze durch Zeilenunterscheidungsspalten] (http://stackoverflow.com/questions/7896909/merge-data-sets-by-row-differening-columns) –

Antwort

0

Update: Ich fand die Lösung, während die Frage schriftlich (in this question lief), so habe ich es bei jemand anderen Begegnungen dieses Problem schreiben würde:

require(plyr) 
rbind.fill(merged, df1[df1$DoNotMerge == 1,]) 

# Result: 
# ID X1 DoNotMerge X2 
# 1 1 NA   NA 200 
# 2 2 101   0 201 
# 3 3 102   0 202 
# 4 1 100   1 NA