有没有一种方法可以在R中的多维数组中优雅地指定切片,从而事先不知道维数?
例如,对于5维数组,可以使用
完成最后一维的切片fourdimslice <- fivedimarray[,,,,1]
但我想为任意维度编写代码,例如
slice <- arbitrarydimarray(dim=5, index=1)
我无法理解do.call('[', ...)
是否会成为一种方法。我也尝试了命名尺寸,但a[fifth=1]
并没有按照我想要的方式进行解释。
我认为像apply()
这样的函数需要做类似的事情。
答案 0 :(得分:5)
您可以使用asub
包中的abind
。
# Sample data: a 5-dimensional array
x <- array(seq_len(prod(2:6)), dim=2:6)
library(abind)
str( asub(x, 1, 5) )
# int [1:2, 1:3, 1:4, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
str( x[,,,,1] )
# int [1:2, 1:3, 1:4, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
all( asub(x, 1, 5) == x[,,,,1] )
# [1] TRUE
答案 1 :(得分:1)
如果您不想使用abind
包,看起来您可以使用基于slice.index
的双线程。我不知道哪个更有效......
x <- array(seq_len(prod(2:6)), dim=2:6)
library(abind)
str( y <- asub(x, 1, 5) )
或者:
z <- x[slice.index(x,5)==1]
这会提取正确的元素但尺寸会丢失。要恢复它们:
dim(z) <- dim(x)[-5]
(你显然可以将它包装在一个合适的函数中。)测试:
all.equal(y,z) ## TRUE
答案 2 :(得分:0)
这是一个提取第一个切片的奇怪解决方案
your.array=array(runif(27),dim=c(3,3,3)) # this is to create an example of array from which you want a slice.
array(your.array[1:prod(dim(your.array)[-1])],dim(your.array)[-1])