R语言:如何将2×6数组按行重塑为3×2×2数组?
解决R数组按行重塑为3×2×2维度的问题
嘿,我明白你的问题啦——你想把这个2行6列的数组按行拆分重组,但直接用array(data, dim=c(3,2,2))没得到预期结果,这是因为R默认的列优先填充顺序和你想要的按行拆分逻辑不一致!
先重现你的原始数据
首先我们先把你的数据还原出来,方便后续验证:
set.seed(10) data <- array(rexp(12), dim=c(2,6)) data
输出和你给出的一致:
[,1] [,2] [,3] [,4] [,5] [,6] [1,] 1.398107 0.1704216 0.1664439 0.01057119 2.3546118 0.5222435 [2,] 1.110459 1.9187813 0.9702900 2.79300971 0.6672384 0.1467129
为什么直接用array()不行?
R在创建数组时,默认会把输入数据按列拉平成一维向量,再按列优先的顺序填充到新维度里。比如你尝试的array(data, dim=c(3,2,2)),会先把data拉平成:1.398107, 1.110459, 0.1704216, 1.9187813, 0.1664439, 0.9702900, ...
再填充到3×2×2的数组中,这显然和你想要的按行拆分逻辑不符。
正确的实现方法
我们需要先按行拆分原数组的每一行,再重组为目标维度。这里有两种简洁的方法:
方法1:先重塑维度再调整顺序
利用array()先把原数组转为2×2×3的临时数组,再用aperm()调整维度顺序,把第三维度移到第一位:
result <- aperm(array(data, dim=c(2,2,3)), c(3,2,1)) result
输出正好是你想要的结果:
, , 1 [,1] [,2] [1,] 1.398107 0.1704216 [2,] 0.1664439 0.01057119 [3,] 2.3546118 0.5222435 , , 2 [,1] [,2] [1,] 1.110459 1.9187813 [2,] 0.9702900 2.79300971 [3,] 0.6672384 0.1467129
方法2:逐行转矩阵再合并
如果你想更直观地控制每一行的拆分,可以先把原数组的每一行转为3×2的矩阵(按行填充),再合并成目标数组:
# 把每行转成3×2的矩阵(byrow=TRUE保证按行填充) row1_mat <- matrix(data[1,], nrow=3, ncol=2, byrow=TRUE) row2_mat <- matrix(data[2,], nrow=3, ncol=2, byrow=TRUE) # 合并为3×2×2的数组 result <- array(c(row1_mat, row2_mat), dim=c(3,2,2))
这个方法逻辑更直观,也能得到完全一致的结果。
核心逻辑总结
你的需求是按行拆分原数组的每一行,将每行的6个元素分成3组(每组2个),作为新数组的每一个切片的行,而R默认的列优先填充会打乱这个顺序,所以我们需要通过调整维度顺序或者手动按行转矩阵来实现。
内容的提问来源于stack exchange,提问作者Ann M
相关产品推荐
相关产品推荐

