Dear list members,
I would like to merge multiple dataframes and seems that this task is going
to be required quite often, so I decided to write a simple (pseudo)recursive
merge.
I started with the case when dataframes are merged by rows (0). But there is
a problem when a dataframe to be merged in the step n has some items that
are not in previous ones. Then I get "Error in match.names(clabs, names(xi))
:   names do not match previous names".
Please help. Thank you Jiri Voller

MergeByRownames<-function(x,a,all.x=T,all.y=T){
    stopifnot(is.list(x))

    x<-lapply(x,as.data.frame,row.names = NULL)
     ## if (any(unlist(lapply(x,
function(x){is.null(rownames(x))})))){stop("Missing
names.")}
           # doesnt work x<-lapply(x,as.data.frame,row.names = NULL)
assignes names (1:n)

    for (i in 1:length(x)){
        if(i==1){
            merged<-x[[i]]
        }else{
            if(i==2){
                 merged<-merge(merged,x[[i]],by.x=0,by.y=0,all.x=all.x,
all.y=all.y,sort=F)
            } else {
                 merged<-merge(merged,x[[i]],by.x="Row.names",by.y=0,
all.x=all.x,all.y=all.y,sort=F)
              }
         }
    }
return(merged)
}

MergeByRownames(test) gives "Error in match.names(clabs, names(xi)) :
names do not match previous names".
Interestingly MergeByRownames.rec(list(test$A,test$A,test$A,test$X)) gives
the same error, while MergeByRownames.rec(list(test$A,test$A,test$X)) works
fine. I cannot see anything fishy on the data frame that is used to merge
with final test$X.

test<-structure(list(A = structure(c("a", "b", "c", "d", "e", "f",
"g", "h", "i", "j"), .Names = c("A", "B", "C", "D", "E", "F",
"G", "H", "I", "J")), B = structure(c("a", "b", "c", "d", "e"
), .Names = c("A", "B", "C", "D", "E")), C = structure(c("e",
"f", "g", "h", "i", "j"), .Names = c("E", "F", "G", "H", "I",
"J")), D = structure(c("b", "c", "d", "e", "f"), .Names = c("B",
"C", "D", "E", "F")), X = structure(c("a", "b", "c", "d", "e",
"f", "g", "h", "i", "j", "k", "l", "m"), .Names = c("A", "B",
"C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"))), .Names = c("A",
"B", "C", "D", "X"))

	[[alternative HTML version deleted]]


