如何将 2D 数据框转换为 3D 矩阵,保留行和列顺序

How to convert 2D data frame to 3D matrix, preserving row and column order

我想将 2D 数据框转换为 3D 矩阵,同时保留行和列顺序。

我有一些这样的数据:

dat<-  data.frame(obs = rep(1:3,2),
  LET=c('A','A','A','B','B','B'),
            x1=c('a','b','c','d','e','f'),
            x2=c('g','h','i','j','k','l')) 
  obs LET x1 x2
1   1   A  a  g
2   2   A  b  h
3   3   A  c  i
4   1   B  d  j
5   2   B  e  k
6   3   B  f  l

我想创建一个 3D 矩阵,输出如下所示:

, , 1

     [,1] [,2] [,3] [,4]
[1,] "1"  "A"  "a"  "g" 
[2,] "1"  "B"  "d"  "j" 

, , 2

     [,1] [,2] [,3] [,4]
[1,] "2"  "A"  "b"  "h" 
[2,] "2"  "B"  "e"  "k" 

, , 3

     [,1] [,2] [,3] [,4]
[1,] "3"  "A"  "c"  "i" 
[2,] "3"  "B"  "f"  "l" 

其中每个 "layer" 是两个 LET 及其 x 值的不同 obs。 当我这样做时 dim(dat) <- c(2,4,3) 订单没有按照我希望的方式保留,我不确定如何调整它以获得正确的格式。

一个选项是 split 将数据放入 list,创建一个 array 指定的 dim 假设并将 list 的值分配给它

lst1 <- split(dat, dat$obs)
ar1 <- array(dim = c(dim(lst1[[1]]), length(lst1)))
for(i in seq_along(lst1)) ar1[,,i] <- as.matrix(lst1[[i]])
ar1
#, , 1

#     [,1] [,2] [,3] [,4]
#[1,] "1"  "A"  "a"  "g" 
#[2,] "1"  "B"  "d"  "j" 

#, , 2

#     [,1] [,2] [,3] [,4]
#[1,] "2"  "A"  "b"  "h" 
#[2,] "2"  "B"  "e"  "k" 

#, , 3

#     [,1] [,2] [,3] [,4]
#[1,] "3"  "A"  "c"  "i" 
#[2,] "3"  "B"  "f"  "l" 

或将所有列转换为 character class,执行 splitunlistlist 并创建 array

dat[] <- lapply(dat, as.character)
lst1 <- split(dat, dat$obs)
array(unlist(lst1), c(dim(lst1[[1]]), length(lst1)))