首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >要列出的三维数组

要列出的三维数组
EN

Stack Overflow用户
提问于 2013-11-26 00:56:55
回答 3查看 10.9K关注 0票数 19

我的问题对你们中的许多人来说可能听起来微不足道,但经过长时间的互联网搜索,我仍然没有得到以下问题的答案:

如何将三维数组转换为“三维”列表?

假设我有以下内容:

代码语言:javascript
复制
A1 <- matrix(runif(12),4,3)
A2 <- matrix(runif(12),4,3)
A3 <- matrix(runif(12),4,3)

MyList  <- list(A1,A2,A3)

MyArray <- array(NA,c(4,3,3))
MyArray[,,1] <- A1
MyArray[,,2] <- A2
MyArray[,,3] <- A3

有没有一种方法可以将MyArray转换成与MyList具有“相同结构”的列表?

非常感谢您的帮助!最好的,罗曼

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-26 11:12:39

为了好玩(因为我来晚了),这里是另一个只使用基数R的n,就像@joran的一样,它是可编程的,您可以很容易地沿着任何给定的维度拆分

代码语言:javascript
复制
split.along.dim <- function(a, n)
  setNames(lapply(split(a, arrayInd(seq_along(a), dim(a))[, n]),
                  array, dim = dim(a)[-n], dimnames(a)[-n]),
           dimnames(a)[[n]])

identical(split.along.dim(MyArray, n = 3), MyList)
# [1] TRUE

它还将保留您的所有dimname,如果您有任何,请参见示例:

代码语言:javascript
复制
dimnames(MyArray) <- Map(paste0, letters[seq_along(dim(MyArray))],
                                 lapply(dim(MyArray), seq))
split.along.dim(MyArray, n = 3)
票数 7
EN

Stack Overflow用户

发布于 2013-11-26 01:05:25

您可以使用lapply

代码语言:javascript
复制
lapply(seq(dim(MyArray)[3]), function(x) MyArray[ , , x])


# [[1]]
#           [,1]       [,2]      [,3]
# [1,] 0.2050745 0.21410846 0.2433970
# [2,] 0.9662453 0.93294504 0.1466763
# [3,] 0.5775559 0.86977616 0.6950287
# [4,] 0.4626039 0.04009952 0.5197830
# 
# [[2]]
#           [,1]      [,2]      [,3]
# [1,] 0.6323070 0.2684788 0.7232186
# [2,] 0.1986486 0.2096121 0.2878846
# [3,] 0.3064698 0.7326781 0.8339690
# [4,] 0.3068035 0.4559094 0.8783581
# 
# [[3]]
#           [,1]      [,2]      [,3]
# [1,] 0.9557156 0.9069851 0.3415961
# [2,] 0.5287296 0.6292590 0.8291184
# [3,] 0.4023539 0.8106378 0.4257489
# [4,] 0.7199638 0.2708597 0.6327383
票数 23
EN

Stack Overflow用户

发布于 2019-02-12 03:31:13

在tidyverse的purrr包中有一个函数array_tree(),它可以以最小的麻烦完成这项工作:

代码语言:javascript
复制
A1 <- matrix(runif(12),4,3)
A2 <- matrix(runif(12),4,3)
A3 <- matrix(runif(12),4,3)

MyList <- list(a1=A1, a2=A2, a3=A3)

MyArray <- purrr::array_tree(MyList)

$`a1`
           [,1]       [,2]       [,3]
[1,] 0.18895576 0.16225488 0.09941778
[2,] 0.69737985 0.01757565 0.84838836
[3,] 0.06849385 0.71726810 0.52981969
[4,] 0.83352338 0.90922401 0.55946707

$a2
          [,1]      [,2]       [,3]
[1,] 0.6498039 0.5015537 0.48840965
[2,] 0.7745612 0.4346254 0.40873822
[3,] 0.4169687 0.3634961 0.01878936
[4,] 0.3753315 0.3008145 0.94580448

$a3
          [,1]      [,2]      [,3]
[1,] 0.3967292 0.8117389 0.9184360
[2,] 0.5729680 0.9466026 0.4086640
[3,] 0.5744074 0.5913192 0.6038389
[4,] 0.4507735 0.2285655 0.8815671

如图所示,默认情况下它会保留名称。一般来说,这应该比plyr::alply() (@joran的答案)更好,因为plyr不再处于活跃的开发中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20198751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档