[R] Embedding lists in matrices and matrices in lists

David Winsemius dwinsemius at comcast.net
Wed Aug 19 12:47:17 CEST 2009


On Aug 19, 2009, at 6:02 AM, Michael Kogan wrote:

> Unfortunately the  matrix(list(),x,y) way seems to have some  
> limitations. I want to continue working with the matrices which are  
> saved in the database matrix. But for example the following doesn't  
> work:
>
> tetrahedron=matrix(c(
> 0,1,1,1,
> 1,0,1,1,
> 1,1,0,1,
> 1,1,1,0
> ),nrow=4, byrow=TRUE) # an example matrix
>
> database=matrix(list(),5,5) # create database matrix
> database[[4,4]]=list(tetrahedron) # save example matrix in database  
> matrix
>
> ## try to access the first row of the saved example matrix ##
> database[[4,4]][1] # prints the whole example matrix

I was surprised that this worked. I would have expected that you would  
have used:
database[4,4][[1]]   since database is a matrix and generally one  
accesses matrix elements
with "[<n>,<m>]" addressing, while the element is a list and would  
need "[[<n>]]" addressing.

> database[[4,4]][1][1,] # should have printed the first row of the  
> example matrix, but gives:

So I tried:

database[4,4][[1]][1,]
# [1] 0 1 1 1 ....Success


>
> Error in database[[4, 4]][1][1,] : incorrect number of dimensions
> Execution halted
>
> The same happens with database[[4,4]][1,]... Is there any way to  
> access the saved matrices like "normal" ones?
>
> Thanks,
> Michael
>
> jim holtman schrieb:
>> Is this what you want:
>>
>>
>>> x <- matrix(list(),3,3)  # create a matrix of lists
>>> # create matrices for testing
>>> for(i in 1:3){
>>>
>> +     for (j in 1:3){
>> +         x[[i,j]] <- matrix(runif((i+1) * (j+1)), i+1)
>> +     }
>> + }
>>
>>> x
>>>
>>     [,1]      [,2]       [,3]
>> [1,] Numeric,4 Numeric,6  Numeric,8
>> [2,] Numeric,6 Numeric,9  Numeric,12
>> [3,] Numeric,8 Numeric,12 Numeric,16
>>
>>> x[[2,2]]  # extract one of them
>>>
>>           [,1]      [,2]      [,3]
>> [1,] 0.26722067 0.3823880 0.4820801
>> [2,] 0.38611409 0.8696908 0.5995658
>> [3,] 0.01339033 0.3403490 0.4935413
>>
>>> str(x)  # structure of the data
>>>
>> List of 9
>> $ : num [1:2, 1:2] 0.266 0.372 0.573 0.908
>> $ : num [1:3, 1:2] 0.38 0.777 0.935 0.212 0.652 ...
>> $ : num [1:4, 1:2] 0.7894 0.0233 0.4772 0.7323 0.6927 ...
>> $ : num [1:2, 1:3] 0.202 0.898 0.945 0.661 0.629 ...
>> $ : num [1:3, 1:3] 0.2672 0.3861 0.0134 0.3824 0.8697 ...
>> $ : num [1:4, 1:3] 0.2448 0.0707 0.0995 0.3163 0.5186 ...
>> $ : num [1:2, 1:4] 0.206 0.177 0.687 0.384 0.77 ...
>> $ : num [1:3, 1:4] 0.186 0.827 0.668 0.794 0.108 ...
>> $ : num [1:4, 1:4] 0.258 0.4785 0.7663 0.0842 0.8753 ...
>> - attr(*, "dim")= int [1:2] 3 3
>>
>>
>> On Tue, Aug 18, 2009 at 4:48 AM, Michael  
>> Kogan<michael.kogan at gmx.net> wrote:
>>
>>> Hi,
>>>
>>> I'm new to programming, new to R and even new to mailing lists so  
>>> please be
>>> patient with me. I need to manage many matrices generated by an R  
>>> program.
>>> These matrices have different dimensions and I'd like to group  
>>> them somehow.
>>> The best way would be to have a big matrix (let's call it  
>>> database) where
>>> every element database[x,y] consists of a list of matrices that  
>>> all have the
>>> dimensions ncol(matrix1)=x and nrow(matrix1)=y. So those matrices  
>>> have to be
>>> embedded into lists and the lists have to be embedded in the big  
>>> database
>>> matrix. If I simply try
>>>
>>>  database=matrix(0,10,10)
>>>  database[4,4]=c(matrix1,matrix2)
>>>
>>> I get
>>>
>>>  Error in database[4, 4] = c(matrix1, matrix2) :
>>>    number of items to replace is not a multiple of replacement  
>>> length
>>>  Execution halted
>>>
>>> which makes sense of course... Is there any possibility to make  
>>> this work?
>>> Or maybe there is a better way to organize those matrices?
>>>
>>> Regards,
>>> Michael

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list