[R] Extract rows from a list object

peter dalgaard pdalgd at gmail.com
Tue Aug 24 11:44:03 CEST 2010


On Aug 24, 2010, at 11:29 AM, Vladimir Mikryukov wrote:

> Dear list members,
> 
> I need to create a table from a huge list object,
> this list consists of matrices of the same size (but with different
> content).
> 
> The resulting n tables should contain the same rows from all matrices.
> 
> For example:
> n <- 23
> x <- array(1:20, dim=c(n,6))
> 
> huge.list <- list()
> for (i in 1:1000) {
>    huge.list[[i]] <- x }
> 
> 
> # One of 1000 matrices
> huge.list[[1]][1:4, 1:6]
>     [,1] [,2] [,3] [,4] [,5] [,6]
> [1,]    1    4    7   10   13   16
> [2,]    2    5    8   11   14   17
> [3,]    3    6    9   12   15   18
> [4,]    4    7   10   13   16   19
> ...
> 
> # The result should be like that:
> # One of n tables (with the row 4 from all 1000 matrices):
>     [,1] [,2] [,3] [,4] [,5] [,6]
> [1,]    4    7   10   13   16   19
> [2,]    4    7   10   13   16   19
> [3,]    4    7   10   13   16   19
> [4,]    4    7   10   13   16   19
> ...
> [999,]    4    7   10   13   16   19
> [1000,]    4    7   10   13   16   19
> 
> 
> # I tried to convert a list object to an array
> ARR <- array(unlist(huge.list), dim = c(dim(huge.list[[1]]),
> length(huge.list)))
> # then split it and use abind function, but it didn't work

You need to look in the direction of lapply() & friends

do.call(rbind,lapply(huge.list,"[",4,))

t(sapply(huge.list,"[",4,TRUE))

both seem to cut the mustard. (Notice that sapply() will cbind() the results automagically, and that for some odd reason it is more unhappy about missing arguments than lapply is.)

For more intelligible and generalizable code, also consider

do.call(rbind, lapply(huge.list, function(x)x[4,]))


-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-help mailing list