Mehr als 2 Datenrahmen in R nach Rownames zusammenführen
Sammle ich Daten aus 4 df und würde gerne Zusammenführen von rownames. Ich bin auf der Suche nach einem effizienten Weg, dies zu tun. Dies ist eine vereinfachte version der Daten, die ich habe.
df1 <- data.frame(N= sample(seq(9, 27, 0.5), 40, replace= T),
P= sample(seq(0.3, 4, 0.1), 40, replace= T),
C= sample(seq(400, 500, 1), 40, replace= T))
df2 <- data.frame(origin= sample(c("A", "B", "C", "D", "E"), 40,
replace= T),
foo1= sample(c(T, F), 40, replace= T),
X= sample(seq(145600, 148300, 100), 40, replace= T),
Y= sample(seq(349800, 398600, 100), 40, replace= T))
df3 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
df4 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
rownames(df1) <- paste("P", sprintf("%02d", c(1:40)), sep= "")
rownames(df2) <- rownames(df1)
rownames(df3) <- rownames(df1)
rownames(df4) <- rownames(df1)
Dies ist, was ich normalerweise tun würde:
# merge df1 and df2
dat <- merge(df1, df2, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df3
dat <- merge(dat, df3, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df4
dat <- merge(dat, df4, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
Wie Sie sehen können, dies erfordert eine Menge code. Meine Frage ist, ob das gleiche Ergebnis erzielt werden kann, mit eher einfachen Mitteln. Ich habe versucht (ohne Erfolg): - UPDATE: dies funktioniert jetzt!
MyMerge <- function(x, y){
df <- merge(x, y, by= "row.names", all.x= F, all.y= F)
rownames(df) <- df$Row.names
df$Row.names <- NULL
return(df)
}
dat <- Reduce(MyMerge, list(df1, df2, df3, df4))
Vielen Dank im Voraus für irgendwelche Vorschläge
InformationsquelleAutor der Frage HDR | 2013-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
join_all
ausplyr
wird wohl tun, was Sie wollen. Aber Sie alle müssen, werden Daten-frames und der rownames Hinzugefügt werden, als eine Spaltetype
argument sollte sogar helfen, wenn die rownames variieren und entsprechen nichtWenn Sie nicht möchten, dass die rownames:
InformationsquelleAutor der Antwort Anto
Bearbeitung Ihrer Funktion, ich kam auf die Funktion, die Ihnen erlaubt zu verschmelzen mehr Daten-frames von einer bestimmten Spalte key (name der Spalte). Die entstandenen Daten-frame beinhaltet alle Variablen der zusammengeführten Daten-frames (wenn Sie wollen, halten Sie nur die gemeinsamen Variablen (ohne NA, Verwendung:
all.x= FALSE, all.y= FALSE
)InformationsquelleAutor der Antwort Roxana Adam
Drei Zeilen code wird Ihnen genau das gleiche Ergebnis:
Ah, ich sehe, jetzt verstehe ich, warum Sie immer in so viel Schmerz. Mit dem alten
for
Schleife sicherlich funktioniert der trick. Vielleicht gibt es noch mehr clevere LösungenInformationsquelleAutor der Antwort Edwin
Bin ich auf der Suche für die gleiche Funktion. Nach dem Versuch ein paar der Optionen, die hier und anderswo. Für mich am einfachsten war:
cbind.Daten.frame( df1,df2,df3,df4....)
InformationsquelleAutor der Antwort Jorge