如何将 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,执行 split
、unlist
、list
并创建 array
dat[] <- lapply(dat, as.character)
lst1 <- split(dat, dat$obs)
array(unlist(lst1), c(dim(lst1[[1]]), length(lst1)))
我想将 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,执行 split
、unlist
、list
并创建 array
dat[] <- lapply(dat, as.character)
lst1 <- split(dat, dat$obs)
array(unlist(lst1), c(dim(lst1[[1]]), length(lst1)))