我有一个三维数组,想通过按行堆叠一维(合并一维的行)来折叠成二维数组。在我的代码中,我填写了一个"工作表"。(三维)在每个索引处都有一个二维数组,现在我想用这个三维数组把这些表格的行堆叠在一起。
这里有一个示例数组,这样我就可以解释我想要的最终结果是什么样子:
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
(这是理想的,实际上,因为数组可能有不同的行号)。在这种情况下,我如何以相同的方式组合列表中多个元素的行?
我将把我的评论推广到一个答案,尽管我仍然认为应该有一种方法可以做到这一点,只是改变尺寸。
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
如何通过操作维度来实现:
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)
。