[R] Create matrix with subset from unlist

David Winsemius dwinsemius at comcast.net
Fri Jan 29 19:15:54 CET 2010


On Jan 29, 2010, at 1:07 PM, Muhammad Rahiz wrote:

> OK, I've got this. The output prints what I want, but I'm not sure  
> if there will be problems in further analysis because the main idea  
> is to convert the data from list to matrix. I'm quite concerned with  
> how I define xx2.
>
>   xx <- unlist(x)   # Unlist  from lapply + read.table
>
>   a <- seq(1,128,by=4) # creates sequence for increment in loop
>
>   xx2 <- list() # Is this the correct definition?
It will "work".
> for (z in 1:32){
> xx2[[z]] <- matrix(xx[c(a[z]:(a[z]+4))],2,2) # which would be a list  
> of matrices
> }
>

If you go back to your original posting, you could shortcut the whole  
process since you already had a list of 32 dataframes (lists) . That  
was the starting point. If a list is acceptable, then skip the  
intermediate array.

 > class(x[[1]])
[1] "data.frame"
 > class(lapply(x, data.matrix)[[1]])
[1] "matrix"

So just do this:

xx2 <- lapply(x, data.matrix)  # a list of matrices

-- 
David.


> When I do,
>   > mode(xx2)
>   > [1] "list"
>
> When I do,
>   > xx3 <- xx2[[1]] + 5   # simple test
>   > mode(xx3)
>   > "numeric"
>
>
> Am I doing this right?
>
>
> Muhammad
>
> ----------
>
> 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
>>
>> 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)
>> }
>>
>>
>> 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
>>>
>>>
>>>
>>
>> ______________________________________________
>> R-help at r-project.org 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.
>>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT



More information about the R-help mailing list