[R] uneven list to matrix

Bert Gunter gunter.berton at gene.com
Fri Aug 24 17:50:30 CEST 2007


It can be done straightforwardly -- don't know about efficientcy -- without
recourse to zoo or merge:

## example data
x<- 1:5
names(x) <- letters[1:5]
alph <- list( x[1:4], x[c(1,3,4)],x[c(1,4,5)])

## Solution
rn <- unique(unlist(sapply(alph,names)))
mx <- matrix( nr=length(rn), nc=length(alph),dimnames = list(rn,NULL))
## use dimnames = sort(rn) if you want to sort them
for(i in seq(length(alph))){y <- alph[[i]]; mx[names(y),i] <- y} 


Bert Gunter
Nonclinical Statistics
7-7374

-----Original Message-----
From: r-help-bounces at stat.math.ethz.ch
[mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Christopher Marcum
Sent: Thursday, August 23, 2007 10:27 PM
To: Gabor Grothendieck
Cc: r-help at stat.math.ethz.ch
Subject: Re: [R] uneven list to matrix

Hi Gabor,

My apologies. Both solutions work just fine on large lists (n=1000,
n[[i]]>=500). A memory problem on my machine caused the error and
fail-to-sort. Thank you!

PS - The zoo method is slightly faster.

Best,
Chris

Gabor Grothendieck wrote:
> 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.
>> >>
>> >
>>
>>
>>
>

______________________________________________
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