假设我在R中有一个维数为== c(150, 40, 30)的数组foo。现在,如果我:
bar <- apply(foo, 3, rbind)dim(bar)现在是c(6000, 30)。
将这个过程从bar转换到foo,并使它们完全相同的最优雅和通用的方法是什么?
问题不在于获得正确的维度,而是在尊重的、原始的、维度的范围内,以相同的顺序返回数据。
感谢您抽出时间,期待您的回复。
附注:对于那些认为这是一个更大的问题的人来说,它是,不,我还不能使用plyr。
发布于 2011-11-06 13:36:08
我认为您可以再次调用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发布于 2011-11-07 07:25:05
我想知道你最初的转变。您从apply调用rbind,但这不会做任何事情--您也可以调用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都是非常强大的(但也有些令人困惑)。很值得学习……
https://stackoverflow.com/questions/8025391
复制相似问题