[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