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

Laurent Rhelp L@urentRHe|p @end|ng |rom |ree@|r
Fri Jul 9 21:33:49 CEST 2021

You are right, this extra level disturbed me.
Very impressive this solution, thank you very much.

Le 09/07/2021 à 19:50, Bill Dunlap a écrit :
> Try
>    matrix(init_l, nrow=4, ncol=4,
> dimnames=list(c("X1","X2","X3","X4"),c("X1","X2","X3","X4")))
> It doesn't give exactly what your code does, but your code introduces
> an extra level of "list", which you may not want.
>
> -Bill
>
> On Fri, Jul 9, 2021 at 10:40 AM Laurent Rhelp <LaurentRHelp using free.fr
> <mailto:LaurentRHelp using free.fr>> 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
>     ## 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
>
>
>
>     --
>     L'absence de virus dans ce courrier électronique a été vérifiée
>     par le logiciel antivirus Avast.
>     https://www.avast.com/antivirus <https://www.avast.com/antivirus>
>
>     ______________________________________________
>     R-help using r-project.org <mailto:R-help using r-project.org> mailing list --
>     To UNSUBSCRIBE and more, see
>     https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>     and provide commented, minimal, self-contained, reproducible code.
>

--
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus

[[alternative HTML version deleted]]