2017-03-02 64 views
2

我想用維度爲k的動態數組對子數組進行子集化。具有動態維度的數組的子集部分

採取例如:

A <- array(1:3^4, dim=c(3,3,3,3)) 

由於尺寸可以變化(在此未示出),我不能簡單地定義的a,b,c,d和經由

a <- 1:2; b <- 2; c <- 2:3; d = 1 
A[a, b, c, d] 

Here使查詢已經表明,如果想要子集只有單個元件,可以這樣做:

e <- 1; f <- 2; g <- 3; h <- 1 
A[matrix(c(e, f, g, h), nrow = 1)] 

這使我可以保持維數的靈活性,但我只能對單個元素進行子集化,因爲我無法表示矩陣中的序列a,b,c,d。

期望的情況是,我能得到的

A[a, b, c, d] 

輸出沒有硬編碼的尺寸,即通過

A[object] 

訪問陣列和問題基本上這是可能的,如果是'對象'是怎樣的。

任何幫助將不勝感激!

+0

什麼? 'A [1,1,1,1]'工作正常。 – alistaire

+0

是的,它不清楚,因爲你的[示例不可重現](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)與定義期望的輸出。 – alistaire

+0

@alistaire使其具有可重現性,希望這有助於 – jmb

回答

2

如果您將object定義爲列表,則可以使用do.call將該列表用作子集功能[的參數。如果包括數組列表中的第一項,可以直接調用[

object <- list(A, a, b, c, d) 

do.call(`[`, object) 
##  [,1] [,2] 
## [1,] 13 22 
## [2,] 14 23 

如果你不希望包括陣列(如果你有很多這些對象和數組大,這將需要大量的內存),你可以寫一個匿名函數僅僅只使用子集參數,沒有什麼是子集:

object <- list(a, b, c, d) 

do.call(function(...){A[...]}, object) 
##  [,1] [,2] 
## [1,] 13 22 
## [2,] 14 23 

這實際上是確切的方法abind::asub需要:

object <- list(a, b, c, d) 

abind::asub(A, object) 
##  [,1] [,2] 
## [1,] 13 22 
## [2,] 14 23 

注意參數匹配這裏的關係,因此,如果一個是空的,它需要包含NULL

object <- list(NULL, b, c, d) 

abind::asub(A, object) 
##  [,1] [,2] 
## [1,] 13 22 
## [2,] 14 23 
## [3,] 15 24 
1

我以前碰到這個,發現這個(快速和骯髒的)方式,採取任意設置矢量並獲取數據。數組讓你傳遞一個數組矩陣,其中每行代表數組中的一個位置。因此,我用expand.grid讓我的子集向量我想看看所有的組合,並利用這一點來得到我想要的值:

A <- array(1:3^4, dim=c(3,3,3,3)) 
a <- 1:2; b <- 2; c <- 2:3; d = 1 

eg<- expand.grid(a,b,c,d) 
mat <- as.matrix(eg) 

print(A[mat]) 
[1] 13 14 22 23