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
______________________________________________
R-help@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.