2016-09-28 12 views
0

1とpの間の整数の(n、m、p)配列と(n、m)私は、整数を不規則(n、m)の値のサブセットを選択するためのインデックスとして使用したいと思います。R:n次元配列をインデックスとして使用してn + 1次元配列をサブセット化する

for(i in 1:dim(values)[1]) { 
for(j in 1:dim(values)[2]) { 
    slice[i, j] <- values[i, j, indices[i, j]] 
} 
} 

Rでこれを行うために、好ましくは平坦化することなく、直感的な組み込み方法がありますか?次元(n1、...、nk、p)の任意の数がある場合はどうなりますか?

+0

サンプルデータと予想出力を含めてください – HubertL

答えて

0

一般化しようとしました。

# example values 
k <- 3 # dim=c(n1, n2, ..., nk) 
n1 <- 5; n2 <- 6; n3 <- 4; p <- 5 
set.seed(1); values <- array(sample(n1*n2*n3*p), dim = c(n1, n2, n3, p)) 
set.seed(1); indices <- array(sample(p, n1*n2*n3, replace = T), dim = c(n1, n2, n3)) 

# do +1 to last dim and put indices into it (to enable apply() to get both information). 
values2 <- array(values, dim=c(n1, n2, n3, p+1)) 
values2[,,,p+1] <- indices 

    values[1,1,1,] # [1] 160 477 111 27 569 
    indices[1,1,1] # [1] 2 
    values2[1,1,1,] # [1] 160 477 111 27 569 2 # last values is index (value2[1,1,1,p+1]) 
    values2[1,1,1,][values2[1,1,1,p+1]] # 477 

# using apply(), get the values with all combination of n1, ..., nk 
slice2 <- apply(values2, 1:k, function(x) x[x[p+1]]) 

    # check just to be sure 
    slice <- array(NA, dim = c(n1, n2, n3)) 
    for(a in 1:n1) for(b in 1:n2) for(c in 1:n3) { 
    slice[a, b, c] <- values[a, b, c, indices[a, b, c]] } 

    identical(slice, slice2) # [1] TRUE # no problem 
関連する問題