将 3d 数组中的工作表行绑定为 2d 数组
Posted
技术标签:
【中文标题】将 3d 数组中的工作表行绑定为 2d 数组【英文标题】:Bind the rows of sheets in a 3d array to make a 2d array 【发布时间】:2014-08-08 03:32:54 【问题描述】:我有一个 3 维数组,想通过逐行堆叠一维(组合一维的行)来折叠成二维数组。在我的代码中,我在每个索引处用二维数组填充了一个“工作表”(第 3 维),现在我想采用该 3 维数组并将这些工作表的行彼此堆叠。
这里是一个示例数组,因此我可以解释我希望最终结果的样子:
x <- array(1:24, dim=c(2, 3, 4),
dimnames=list(letters[1:2], LETTERS[1:3], letters[23:26]))
dim(x)
我希望将w
、x
、y
、z
堆叠成一个二维数组,该数组有 8 行和 3 列。这是一种很麻烦的方法(在我的循环中是不可能的):
x1<-x[,,1]
x2<-x[,,2]
x3<-x[,,3]
x4<-x[,,4]
All<-rbind(x1,x2,x3,x4)
我查看了abind
和adrop
,但它们并不完全正确。
我也试过aperm
,但我不认为你可以用这个来减少尺寸,只是转置(?)
或者,我可以创建一个list
(这实际上是理想的,因为数组可能有不同的行号)。在那种情况下,我将如何以相同的方式组合列表中多个元素的行?
谢谢!
【问题讨论】:
看看abind
包
apply(x, 2, c)
也许?
删除了我的答案,因为我误解了你的 Q,并且@thelatemail 是正确的。请注意,如果您确实想使用列表,则等效为:do.call(rbind, L)
for list L
。
相当优雅的@thelatemail。这正是我想要的!谢谢大家,是的,列表信息也非常有用。
【参考方案1】:
我会将我的评论推广到答案,但我仍然认为应该有一种方法来做到这一点,只是改变尺寸。
apply(x, 2, c)
#or if you're really pushing for speed, the simpler function:
apply(x, 2, identity)
# Giving:
# A B C
#[1,] 1 3 5
#[2,] 2 4 6
#[3,] 7 9 11
#[4,] 8 10 12
#[5,] 13 15 17
#[6,] 14 16 18
#[7,] 19 21 23
#[8,] 20 22 24
在没有行名的情况下匹配请求的输出:
all.equal(apply(x,2,c), All, check.attributes=FALSE)
#[1] TRUE
【讨论】:
我现在记得我很久以前就遇到过这个问题,并找到了这种方法courtesy of Gabor。我在心里记下了它,但显然我没有。 除了这正是 OP 提供的。可以概括为:do.call(rbind, lapply(1:dim(x)[[3]], function(s) x[,, s]))
@BondedDust:假设这是针对我的,Gabor 表明 apply(y, 2, I)
与 rbind
结果相同 :)
啊,明白了。第一遍对我来说太微妙了。 Gabor 是一位非常熟练的用户。
我认为不可能只改变维度,因为基础值的顺序不同。【参考方案2】:
以下是如何通过操作尺寸来做到这一点:
y <- aperm(x, c(1, 3, 2))
dim(y) <- c(prod(dim(x)[-2]), dim(x)[2])
# the above evaluates to c(8, 3)
y
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# [3,] 7 9 11
# [4,] 8 10 12
# [5,] 13 15 17
# [6,] 14 16 18
# [7,] 19 21 23
# [8,] 20 22 24
如果需要,请联系colnames(y) <- colnames(x)
。
【讨论】:
以上是关于将 3d 数组中的工作表行绑定为 2d 数组的主要内容,如果未能解决你的问题,请参考以下文章