如何巧妙地对 R 中具有动态维度的数组进行子集化?
How do I smartly subset an array in R with dynamic dimensions?
我正在制作一个模拟模型,我认为这个问题很容易解决,但我只是不习惯使用数组。假设我有一个数组 Array1
,它有 3 个维度。前两个是恒定且等长的,L
,但第三个维度的长度可以在任何给定时间从 1 到 X。
我希望能够定期对 Array1
进行子集化以创建第二个数组 Array2
,它由 到 最后一个 Y "sheets" 共 Array1
。换句话说,如果 Array1
的第三维长度大于 Y,那么我只想要 Array1
的最后 Y 张,但是,如果它小于 Y,我想要所有 [= =11=]。
我知道我可以使用 tail 函数和一些花招粗略地完成它:
tmp1 = tail(Array1, (L*L*Y))
Array2 = array(tmp1, dim = (L, L, (L*L/length(tmp1))))
但似乎可以有更优雅的方式来做到这一点。 R 中的数组是否有 tail
的等价物?或者有没有一种方法可以通过 Array1
的简单逻辑索引生成 Array2
?或者也许 apply
函数可以以某种方式使用?
你在找这样的东西吗?
a <- array(1:(3*4*5), dim=c(3,4,5))
x <- dim(a)[3]
y <- 2
a[, , seq(to=x, len=min(x, y))]
, , 1
[,1] [,2] [,3] [,4]
[1,] 37 40 43 46
[2,] 38 41 44 47
[3,] 39 42 45 48
, , 2
[,1] [,2] [,3] [,4]
[1,] 49 52 55 58
[2,] 50 53 56 59
[3,] 51 54 57 60
我正在制作一个模拟模型,我认为这个问题很容易解决,但我只是不习惯使用数组。假设我有一个数组 Array1
,它有 3 个维度。前两个是恒定且等长的,L
,但第三个维度的长度可以在任何给定时间从 1 到 X。
我希望能够定期对 Array1
进行子集化以创建第二个数组 Array2
,它由 到 最后一个 Y "sheets" 共 Array1
。换句话说,如果 Array1
的第三维长度大于 Y,那么我只想要 Array1
的最后 Y 张,但是,如果它小于 Y,我想要所有 [= =11=]。
我知道我可以使用 tail 函数和一些花招粗略地完成它:
tmp1 = tail(Array1, (L*L*Y))
Array2 = array(tmp1, dim = (L, L, (L*L/length(tmp1))))
但似乎可以有更优雅的方式来做到这一点。 R 中的数组是否有 tail
的等价物?或者有没有一种方法可以通过 Array1
的简单逻辑索引生成 Array2
?或者也许 apply
函数可以以某种方式使用?
你在找这样的东西吗?
a <- array(1:(3*4*5), dim=c(3,4,5))
x <- dim(a)[3]
y <- 2
a[, , seq(to=x, len=min(x, y))]
, , 1
[,1] [,2] [,3] [,4]
[1,] 37 40 43 46
[2,] 38 41 44 47
[3,] 39 42 45 48
, , 2
[,1] [,2] [,3] [,4]
[1,] 49 52 55 58
[2,] 50 53 56 59
[3,] 51 54 57 60