On 8/24/07, Christopher Marcum <[EMAIL PROTECTED]> wrote: > Hi Gabor, > > Thank you. The native solution works just fine, though there is an > interesting side effect, namely, that with very large lists the rows of > the output become scrambled though the corresponding columns are correctly > sorted. The zoo package solution does not work on large lists: there is an > error: > > Error in order(na.last, decreasing, ...) : > argument 1 is not a vector
They both work on the example data. Please provide reproducible examples to illustrate your comments if you would like a response. > > Gabor Grothendieck wrote: > > Here are two solutions. The first repeatedly uses merge and the > > second creates a zoo object from each alph component whose time > > index consists of the row labels and uses zoo's multiway merge to > > merge them. > > > > # test data > > m <- matrix(1:5, 5, dimnames = list(LETTERS[1:5], NULL)) > > alph <- list(m[1:4,,drop=F], m[c(1,3,4),,drop=F], m[c(1,4,5),,drop=F]) > > alph > > > > # solution 1 > > out <- alph[[1]] > > for(i in 2:length(alph)) { > > out <- merge(out, alph[[i]], by = 0, all = TRUE) > > row.names(out) <- out[[1]] > > out <- out[-1] > > } > > matrix(as.matrix(out), nrow(out), dimnames=list(rownames(out),NULL)) > > > > # solution 2 > > library(zoo) > > z <- do.call(merge, lapply(alph, function(x) zoo(c(x), rownames(x)))) > > matrix(coredata(z), nrow(z), dimnames=list(time(z),NULL)) > > > > > > On 8/23/07, Christopher Marcum <[EMAIL PROTECTED]> wrote: > >> Hello, > >> > >> I am sure I am not the only person with this problem. > >> > >> I have a list with n elements, each consisting of a single column matrix > >> with different row lengths. Each row has a name ranging from A to E. > >> Here > >> is an example: > >> > >> alph[[1]] > >> A 1 > >> B 2 > >> C 3 > >> D 4 > >> > >> alph[[2]] > >> A 1 > >> C 3 > >> D 4 > >> > >> alph[[3]] > >> A 1 > >> D 4 > >> E 5 > >> > >> > >> I would like to create a matrix from the elements in the list with n > >> columns such that the row names are preserved and NAs are inserted into > >> the cells where the uneven lists do not match up based on their row > >> names. > >> Here is an example of the desired output: > >> > >> newmatrix > >> [,1] [,2] [,3] > >> A 1 1 1 > >> B 2 NA NA > >> C 3 3 NA > >> D 4 4 4 > >> E NA NA 5 > >> > >> Any suggestions? > >> I have tried > >> do.call("cbind",list) > >> I also thought I was on the right track when I tried converting each > >> element into a vector and then running this loop (which ultimately > >> failed): > >> > >> newmat<-matrix(NA,ncol=3,nrow=5) > >> colnames(newmatrix)<-c(A:E) > >> for(j in 1:3){ > >> for(i in 1:5){ > >> for(k in 1:length(list[[i]])){ > >> if(is.na(match(colnames(newmatrix),names(alph[[i]])))[j]==TRUE){ > >> newmatrix[i,j]<-NA} > >> else newmatrix[i,j]<-alph[[i]][k]}}} > >> > >> Thanks, > >> Chris > >> UCI Sociology > >> > >> ______________________________________________ > >> R-help@stat.math.ethz.ch 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. > >> > > > > > ______________________________________________ R-help@stat.math.ethz.ch 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.