[R] Multiple merge, better solution?
Gabor Grothendieck
ggrothendieck at gmail.com
Thu Feb 19 15:24:17 CET 2009
The zoo package has a multi-way merge for zoo objects. Its
just do.call(merge, z) where z is a list of zoo objects.
In detail:
set.seed(1)
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))
# create list of data frames
DFs <- list(A = DF1, B = DF2, C = DF3, D = DF4)
library(zoo)
# convert to list of zoo objects
z <- lapply(DFs, function(x) zoo(as.matrix(x[ ,-1, drop = FALSE]),
as.character(x[,1])))
# perform merge
zz <- do.call(merge, z)
# to convert back to data frame
DF <- as.data.frame(var1 = time(zz), coredata(zz))
On Thu, Feb 19, 2009 at 6:00 AM, Lauri Nikkinen <lauri.nikkinen at iki.fi> wrote:
> 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
>> ______________________________
>>
>>
>
> ______________________________________________
> 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.
>
More information about the R-help
mailing list