Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

converting a matrix of lists to a regular matrix

Tags:

list

r

matrix

Take the following code:

foo <- list()
foo[[1]] <- list(a=1, b=2)
foo[[2]] <- list(a=11, b=22)
foo[[3]] <- list(a=111, b=222)
result <- do.call(rbind, foo)
result[,'a']

In this case, result[,'a'] shows a list. Is there a more elegant way such that result is a "regular" matrix of vectors? I imagine there are manual ways of going about this, but I was wondering if there was an obvious step that I was missing.

like image 208
andrewj Avatar asked Oct 03 '09 23:10

andrewj


2 Answers

do.call on lists is very elegant, and fast. In fact do.call(rbind, my.list) once saved my ass when I needed to combine a huge list. It was by far the fastest solution.

To solve your problem, maybe something like:

do.call(rbind, lapply(foo, unlist))


> result.2 <- do.call(rbind, lapply(foo, unlist))
> result.2
       a   b
[1,]   1   2
[2,]  11  22
[3,] 111 222
> result.2[, 'a']
[1]   1  11 111
> 
like image 191
Vince Avatar answered Nov 12 '22 09:11

Vince


One possible solution is as follows (but am interested in alternatives):

new.result <- matrix(unlist(result), ncol=ncol(result), 
              dimnames=list(NULL, colnames(result)))
like image 39
andrewj Avatar answered Nov 12 '22 08:11

andrewj