首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rbind反转应用

使用rbind反转应用
EN

Stack Overflow用户
提问于 2011-11-06 13:24:32
回答 2查看 232关注 0票数 5

假设我在R中有一个维数为== c(150, 40, 30)的数组foo。现在,如果我:

代码语言:javascript
复制
bar <- apply(foo, 3, rbind)

dim(bar)现在是c(6000, 30)

将这个过程从bar转换到foo,并使它们完全相同的最优雅和通用的方法是什么?

问题不在于获得正确的维度,而是在尊重的、原始的、维度的范围内,以相同的顺序返回数据。

感谢您抽出时间,期待您的回复。

附注:对于那些认为这是一个更大的问题的人来说,它是,不,我还不能使用plyr

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-06 13:36:08

我认为您可以再次调用array并指定原始尺寸:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2011-11-07 07:25:05

我想知道你最初的转变。您从apply调用rbind,但这不会做任何事情--您也可以调用identity

代码语言:javascript
复制
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建议的那样):

代码语言:javascript
复制
# 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都是非常强大的(但也有些令人困惑)。很值得学习……

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

https://stackoverflow.com/questions/8025391

复制
相关文章

相似问题

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