Laurent Rhelp
2021-Jul-09 17:40 UTC
[R] How to create a matrix from a list without a for loop
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
Bill Dunlap
2021-Jul-09 17:50 UTC
[R] How to create a matrix from a list without a for loop
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 at 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
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>
[[alternative HTML version deleted]]
David Winsemius
2021-Jul-09 17:50 UTC
[R] How to create a matrix from a list without a for loop
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 <- 4Just 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 > > >