Jiří Voller
2008-Jan-13 23:47 UTC
[R] Trying to write Merge for more data.frames - Error in match.names(clabs, names(xi))
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]]
Gabor Grothendieck
2008-Jan-14 00:47 UTC
[R] Trying to write Merge for more data.frames - Error in match.names(clabs, names(xi))
Note that the zoo package has a multiway merge for zoo class time series:> library(zoo)as.matrix(do.call(merge, lapply(test, function(x) zoo(unname(x), names(x))))) A B C D X A "a" "a" NA NA "a" B "b" "b" NA "b" "b" C "c" "c" NA "c" "c" D "d" "d" NA "d" "d" E "e" "e" "e" "e" "e" F "f" NA "f" "f" "f" G "g" NA "g" NA "g" H "h" NA "h" NA "h" I "i" NA "i" NA "i" J "j" NA "j" NA "j" K NA NA NA NA "k" L NA NA NA NA "l" M NA NA NA NA "m" On Jan 13, 2008 6:47 PM, Ji?? Voller <jirivoller at gmail.com> wrote:> 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]] > > ______________________________________________ > 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. >
Reasonably Related Threads
- Error in match.names(clabs, names(xi))
- Constructin a call of function including permutation of column names - how to escape parentheses?
- Rbind with data frames -- column names question
- Exporting of R dendrogram object in the format of Eisen´s Cluster
- passing arguments to a function problem