[R] uneven list to matrix
Gabor Grothendieck
ggrothendieck at gmail.com
Fri Aug 24 07:05:03 CEST 2007
On 8/24/07, Christopher Marcum <cmarcum at uci.edu> 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 <cmarcum at uci.edu> 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 at 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.
> >>
> >
>
>
>
More information about the R-help
mailing list