假设我在R中有一个数组foo
,其维度为== c(150, 40, 30)
。
现在,如果我:
bar <- apply(foo, 3, rbind)
dim(bar)
现在是c(6000, 30)
。
反转此过程的最优雅和通用的方法是什么,从bar
转到foo
以便它们完全相同?
问题不在于维度是否合适,而是以相同的顺序将数据恢复到原来的维度中。
感谢您抽出宝贵时间,我期待您的回复。
P.S。对于那些认为这是一个更大问题的一部分的人来说,它是,但不,我还不能使用plyr
。
答案 0 :(得分:7)
我认为您可以再次致电array
并指定原始尺寸:
m <- array(1:210,dim = c(5,6,7))
m1 <- apply(m, 3, rbind)
m2 <- array(as.vector(m1),dim = c(5,6,7))
all.equal(m,m2)
[1] TRUE
答案 1 :(得分:4)
我想知道你的初步转型。您从rbind
致电apply
,但这不会做任何事情 - 您也可以致电identity
!
foo <- array(seq(150*40*30), c(150, 40, 30))
bar <- apply(foo, 3, rbind)
bar2 <- apply(foo, 3, identity)
identical(bar, bar2) # TRUE
那么,你真正想要完成的是什么?我假设你有几个(30)矩阵切片并且想要堆叠它们然后再次将它们拆开。如果是这样,代码将比@joran建议更多。你需要打电话给aperm
(正如@Patrick Burns建议的那样):
# Make a sample 3 dimensional array (two 4x3 matrix slices):
m <- array(1:24, 4:2)
# Stack the matrix slices on top of each other
m2 <- matrix(aperm(m, c(1,3,2)), ncol=ncol(m))
# Reverse the process
m3 <- aperm(array(m2, c(nrow(m),dim(m)[[3]],ncol(m))), c(1,3,2))
identical(m3,m) # TRUE
在任何情况下,aperm
都非常强大(而且有点令人困惑)。非常值得学习...