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
Hi: Below is a TOTAL HACK and I don't recommend it but it does seem to
do what you want. I think that I remember Gabor saying that you can
merge multiple data frames using zoo but I don't know the specifics. I'm
sure he'll respond with the correct way. Below uses a global variable
to access the
dataframe inside the loop and keeps adding on to it. Don't use it unless
you're really desperate for a solution.
DF <- DF1
for ( .df in list(DF2,DF3,DF4) ) {
DF<<-merge(DF,.df,by.x="var1", by.y="var1", all=T)
}
print(DF)
On Thu, Feb 19, 2009 at 5:21 AM, 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.
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
Another option using Recall,
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
my.list <- list(DF1, DF2, DF3, DF4)
test2 <- merge.rec(my.list, by.x="var1", by.y="var1",
all=T)
all.equal(test2, g)
Note that your second example does not work because in the last step
there are no common names between g and DF4 (I think). Using
suffixes=c("", "") seems to do the trick but I'm not
sure it's giving
the result you want/expect.
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
Reasonably Related Threads
- splitting into multiple dataframes and then create a loop to work
- merging dataframes with an unequal number of variables
- merging single column from different dataframe
- create data frame(s) from a list with different numbers of rows
- Merge two columns of a data frame