[R] Multiple merge, better solution?

Lauri Nikkinen lauri.nikkinen at iki.fi
Thu Feb 19 12:00:35 CET 2009


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 <ba208 at 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 at 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
> ______________________________
>
>




More information about the R-help mailing list