2012-11-28 21 views
5

Rの多次元配列を部分集合化する関数が必要です。その関数が呼び出されるまで、その次元に沿った次元や長さはわかりません。配列インデックス保存構造

# subset a 3-d array; leave dims 1 and 2, but start 3rd dim at its 11th value 
mydim <- dim(myarr) 
myarr[, , 11:mydim[3]] 

# subset a 4-d array; leave dims 1, 3 and 4, but start 2rd dim at its 8th value 
mydim <- dim(myarr) 
myarr[, 8:mydim[2], , ] 

私は常に1つの次元に沿ってサブセットする必要があり、サブセットは、配列に行列のインデックスが魅力的に見えないので、私はまた、配列構造を維持する必要が1以外の値で開始することは常にあります。前もって感謝します。

+0

興味深い

sampleArray <- function(myarr, dm, start, leng) { ## arguments: ## dm is the dimension selected ## start is where in dm to being ## leng is how far in from dm to go ## start+leng <= dim(myarr)[dm] leng <- leng-1 # error check if (start+leng > dim(myarr)[dm]) warning("leng too long by ", start+leng - dim(myarr)[dm], ".") #initialize a vector of all TRUE indx <- as.list(rep(TRUE, length(dim(myarr)))) # change the required dimension to the required sequence indx[[dm]] <- seq(start, start+leng) indx <- paste(indx, collapse=",") expr <- paste0("myarr[", indx, "]") # return the appropriate sample eval(parse(text=expr)) } 

例...あまりにもテストされています。その次元に沿った長さや何か別のものがどれくらいあるのかを「どれくらい」言うのでしょうか? –

+0

はい、私はその次元に沿った長さを意味します –

+0

私はこの種の操作のためにリスト()を提案しません –

答えて

1

はここで行列に基づいて配列をサブセット化の可能性を活用するオプションです:

myarr <- array(1:(2*3*4), dim = c(2, 3, 4)) 

myfun <- function(arr, from, len, Dim){ 
    dimArr <- dim(arr) 
    if(missing(len)){ 
     subIdx <- from:dimArr[Dim] 
    } else { 
     subIdx <- from:(from + len - 1) 
    } 
    arrD <- lapply(as.list(dimArr), seq_len) 
    arrD[[Dim]] <- subIdx 
    subMat <- as.matrix(do.call(expand.grid, arrD)) 
    array(arr[subMat], dim = lapply(arrD, length)) 
} 

> myfun(myarr, 2, 1, 3) 
, , 1 

    [,1] [,2] [,3] 
[1,] 7 9 11 
[2,] 8 10 12 

> myfun(myarr, 2, Dim = 3) 
, , 1 

    [,1] [,2] [,3] 
[1,] 7 9 11 
[2,] 8 10 12 

, , 2 

    [,1] [,2] [,3] 
[1,] 13 15 17 
[2,] 14 16 18 

, , 3 

    [,1] [,2] [,3] 
[1,] 19 21 23 
[2,] 20 22 24 
+0

@JackTannerは、「長さに沿った」コメントを見ただけで(別のやり方として理解しています)あなたが望むことを編集できない場合は、お知らせください! – BenBarnes

1

ここに行きます!

# sample array 
myarr <- array(1:2250, dim=c(15, 10, 15)) 

# example call 
sampleArray(myarr, dm=2, start=4, leng=3) 
+0

:indxはベクトルで、3番目の値を別のベクトルに変更すると "置換の長さの倍数ではありません " –

+0

@Jack Tanner - それを編集しました。それは今すぐに動作するはずです –

+0

それはほとんど動作します!あなたはstart + leng-1を意味します。私はそれがバグフリーだったので、私は他の答えを受け入れたが、私に素晴らしい代替手段を提示してくれてありがとう。 –