[R] Create matrix with subset from unlist

David Winsemius dwinsemius at comcast.net
Fri Jan 29 19:02:05 CET 2010


On Jan 29, 2010, at 12:43 PM, Muhammad Rahiz wrote:

> Thanks David & Dennis,
>
> I may have found something.
>
> Given that the object xx is the product of unlist(x), to create a  
> 2x2 matrix with subsets, I could do,
>
> > y <- matrix(xx[c(1:4)], 2, 2).
>
> This returns,
>
>     [,1]  [,2]
> [1,] -27.3  14.4
> [2,]  29.0 -38.1

Much simpler to do:

 > xx[ , , 1]
       [,1]  [,2]
[1,] -27.3  14.4
[2,]  29.0 -38.1

>
> If I do,
>
> > y2 <- matrix(xx[c(5:8)],2,2)
>
> it returns,
>
>     [,1] [,2]
> [1,]  14.4 29.0
> [2,] -38.1 -3.4
>
> The results are exactly what I want to achieve.
>
> The question is, how can I incorporate the increment in a for loop  
> so that it becomes
>
> c(1:4)
> c(5:8)
> c(9:12) and so on


>
> How should I modify this code?
>
> y <- 		# typeof ? for (i in 1:32){
> y[[i]] <- matrix(xx[c(1:4)],2,2)
> }

I don't get it. You had the data in a list. You wanted it out of that  
list, and now you're going to put it back in another list???  ( y2  
would not be the same as y[[2]] )  What's wrong with xx[ , , 2]?

>
>
> Muhammad
>
>
> David Winsemius wrote:
>> On Jan 29, 2010, at 9:45 AM, Dennis Murphy wrote:
>>
>>
>>> Hi:
>>>
>>> The problem, I'm guessing, is that you need to assign each of the   
>>> matrices
>>> to an object.
>>> There's undoubtedly a slick apply family solution for this (which  
>>> I  want to
>>> see, BTW!),
>>>
>>
>> I don't have a method that would assign names but you could  
>> populate  an array of sufficient size and dimension. I populated a  
>> three-element  list with his data:
>>
>> > dput(x)
>> list(structure(list(V1 = c(-27.3, 29), V2 = c(14.4, -38.1)), .Names  
>> =  c("V1",
>> "V2"), class = "data.frame", row.names = c("1", "2")),  
>> structure(list(
>>     V1 = c(14.4, -38.1), V2 = c(29, -3.4)), .Names = c("V1",
>> "V2"), class = "data.frame", row.names = c("1", "2")),  
>> structure(list(
>>     V1 = c(29, -3.4), V2 = c(-38.1, 55.1)), .Names = c("V1",
>> "V2"), class = "data.frame", row.names = c("1", "2")))
>>
>> > xx <- array( , dim=c(2,2,3))
>>
>> > xx[,,1:3] <- sapply(x, data.matrix)
>> > xx
>> , , 1
>>
>>       [,1]  [,2]
>> [1,] -27.3  14.4
>> [2,]  29.0 -38.1
>>
>> , , 2
>>
>>       [,1] [,2]
>> [1,]  14.4 29.0
>> [2,] -38.1 -3.4
>>
>> , , 3
>>
>>      [,1]  [,2]
>> [1,] 29.0 -38.1
>> [2,] -3.4  55.1
>>
>> Without the more complex structure ready to accept the 2x2 arrays  
>> I  got this:
>>
>> > sapply(x, data.matrix)
>>       [,1]  [,2]  [,3]
>> [1,] -27.3  14.4  29.0
>> [2,]  29.0 -38.1  -3.4
>> [3,]  14.4  29.0 -38.1
>> [4,] -38.1  -3.4  55.1
>>
>>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT



More information about the R-help mailing list