Thanks, both solutions work fine. I tried these solutions to my real
data, and I got an error
Error in match.names(clabs, names(xi)) :
names do not match previous names
I refined this example data to look more like my real data, this also
produces the same error. Any ideas how to prevent this error?
DF1 <- data.frame(var1 = letters[1:5], a = rnorm(5), b = rnorm(5), c
= rnorm(5))
DF2 <- data.frame(var1 = letters[3:7], a = rnorm(5), b = rnorm(5), c
= rnorm(5))
DF3 <- data.frame(var1 = letters[6:10], a = rnorm(5), b = rnorm(5), c
= rnorm(5))
DF4 <- data.frame(var1 = letters[8:12], a = rnorm(5), b = rnorm(5), c
= rnorm(5))
g <- merge(DF1, DF2, by.x="var1", by.y="var1", all=T)
g <- merge(g, DF3, by.x="var1", by.y="var1", all=T)
merge(g, DF4, by.x="var1", by.y="var1", all=T)
Error in match.names(clabs, names(xi)) :
names do not match previous names
DF <- DF1
for ( .df in list(DF2,DF3,DF4) ) {
+ DF <-merge(DF,.df,by.x="var1", by.y="var1", all=T)
+ }
Error in match.names(clabs, names(xi)) :
names do not match previous names
Reduce(function(x, y) merge(x, y, all=T,by.x="var1", by.y="var1"),
list(DF1, DF2, DF3, DF4), accumulate=F)
Error in match.names(clabs, names(xi)) :
names do not match previous names
- Lauri
2009/2/19 baptiste auguie <ba...@exeter.ac.uk>:
Hi,
I think Reduce could help you.
DF1 <- data.frame(var1 = letters[1:5], a = rnorm(5))
DF2 <- data.frame(var1 = letters[3:7], b = rnorm(5))
DF3 <- data.frame(var1 = letters[6:10], c = rnorm(5))
DF4 <- data.frame(var1 = letters[8:12], d = rnorm(5))
g <- merge(DF1, DF2, by.x="var1", by.y="var1", all=T)
g <- merge(g, DF3, by.x="var1", by.y="var1", all=T)
g <- merge(g, DF4, by.x="var1", by.y="var1", all=T)
test <- Reduce(function(x, y) merge(x, y, all=T,by.x="var1",
by.y="var1"),
list(DF1, DF2, DF3, DF4), accumulate=F)
all.equal(test, g) # TRUE
As a warning, it's the first time I've ever used it myself...
Hope this helps,
baptiste
On 19 Feb 2009, at 10:21, Lauri Nikkinen wrote:
Hello,
My problem is that I would like to merge multiple files with a
common
column but merge accepts only two
data.frames to merge. In the real situation, I have 26 different
data.frames with a common column. I can of course use merge many
times
(see below) but what would be more sophisticated solution? For loop?
Any ideas?
DF1 <- data.frame(var1 = letters[1:5], a = rnorm(5))
DF2 <- data.frame(var1 = letters[3:7], b = rnorm(5))
DF3 <- data.frame(var1 = letters[6:10], c = rnorm(5))
DF4 <- data.frame(var1 = letters[8:12], d = rnorm(5))
g <- merge(DF1, DF2, by.x="var1", by.y="var1", all=T)
g <- merge(g, DF3, by.x="var1", by.y="var1", all=T)
merge(g, DF4, by.x="var1", by.y="var1", all=T)
Thanks in advance.
-Lauri
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
_____________________________
Baptiste AuguiƩ
School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK
Phone: +44 1392 264187
http://newton.ex.ac.uk/research/emag
______________________________