[R] How to create a matrix from a list without a for loop

David Winsemius
Fri, 09 Jul 2021 17:50:06 -0000

On 7/9/21 10:40 AM, Laurent Rhelp wrote:
> Dear R-Help-list,
>
> ? I have a list init_l containing 16 dataframes and I want to create a
> matrix 4 x 4 from this list with a dataframe in every cell of the
> matrix. I succeeded to do that but my loop is very uggly (cf. below).
> Could somebody help me to write nice R code to do this loop ?
>
> Thank you very much
>
> Laurent
>
>
> ##
> ## mock data, 16 dataframes in a list
> ##
> init_l <- lapply( seq(1,16) , function(x) {
> ? data.frame( V1 = rnorm(3),
> ????????????? V2 = rnorm(3),
> ????????????? V3 = rnorm(3)
> ??????????? )
> })
>
> ##
> ## lists matrix creation with n = 4 columns and n = 4 rows
> ##
> n <- 4



Just assign a dimension attribute and you will have your two dimensional
structure


 > dim(init_l) <- c(n,n)
 > init_l[ 2,2]
[[1]]
 ????????? V1???????? V2???????? V3
1 -1.4103259? 1.9214184 -0.1590919
2? 0.1899490? 0.3842191? 2.4502078
3 -0.4282764 -0.9992190? 1.5384344

 > is.matrix(init_l)
[1] TRUE

--

David

> ## an example of row to create the matrix with lists in the cells
> one_row <- rbind( rep( list(rep(list(1),3)) , n) )
> mymat <- do.call( "rbind" , rep( list(one_row) , n) )
>
> ##
> ## The UGGLY loop I would like to improve:
> ##
>
> ## populate the matrix
> k <- 1
> for( i in 1:n){
> ? for( j in 1:n){
> ??? mymat[i,j][[1]] <- list( init_l[[ k ]] )
> ??? k <- k+1
> ? }
> }
>
> colnames(mymat) <- c("X1", "X2", "X3",
"X3")
> rownames(mymat) <- c("X1", "X2", "X3",
"X4")
>
>
> mymat
>
> # X1???? X2???? X3???? X3
> # X1 List,1 List,1 List,1 List,1
> # X2 List,1 List,1 List,1 List,1
> # X3 List,1 List,1 List,1 List,1
> # X4 List,1 List,1 List,1 List,1
>
>
> #
> # verification, it works
> #
> mymat[2,2]
> init_l[[6]]
>
> ##
> init_l[[6]]
>
> library(tidyverse)
> mymat.t <- as.tibble(mymat)
> mymat.t
> unnest(mymat.t[2,2],cols="X2")[[1]][[1]]
>
> mymat.df <- as.data.frame(mymat)
> mymat.df[2,2][[1]][[1]]
>
>
> thx
>
>
>