2016-04-11 15 views
3

3次元配列のインデックス付けに関する質問があります。Rインデックス配列。 3次元の行列を使用して3次元配列をインデックスする方法

は、私は今、すべての[i,j]位置に対する3次元のインデックスを保持するマトリクスに従って、この配列から値を抽出する3次元アレイ

x<- c(1:36) 
dim(x) <- c(3,4,3) 

を有していると言います。

y <- c(rep(1,4),rep(2,4),rep(3,4)) 
dim(y) <- c(3,4) 

y 
     [,1] [,2] [,3] [,4] 
[1,] 1 1 2 3 
[2,] 1 2 2 3 
[3,] 1 2 3 3 

だから、結果はこれを与えるべきである:

 [,1] [,2] [,3] [,4] 
[1,] 1 4 19 34 
[2,] 2 17 20 35 
[3,] 3 18 33 36 

これを行うには、いくつかのエレガントな方法はありますか?私は2つのforループを使って配列を調べる方法を知っていますが、これは私のデータにとっては遅すぎます。

答えて

6

help("[")この教えてくれる:

行列と配列

[...]

インデクシングの第三の形態は、各次元に対して1つの列を持つ数値行列を介するものです: インデックス行列の各行は、配列の単一の要素を選択し、 の結果はベクトルです。

このように、yマトリックスは、これに準拠した形状に変換されます。

library(reshape2) 
z <- x[as.matrix(melt(y))] 
dim(z) <- dim(y) 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 4 19 34 
#[2,] 2 17 20 35 
#[3,] 3 18 33 36 
+0

ありがとうございました。そして、ヘルプファイルを読むことはとても良い考えです。常に。ところで、インデックスのマトリックスでいくつかの条件テストを使用することは可能ですか? x> 3のような? – Atomhamster

4

私はこれをいくつかのコードゴルフのチャンスとして考えています。ワンライナーとしてこれを行うには間違いなく可能それは:ローランドの答えが示す@として

> `dim<-`(x[cbind(c(row(y)), c(col(y)), c(y))], dim(y)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 19 34 
[2,] 2 17 20 35 
[3,] 3 18 33 36 

、マトリックス/アレイのインデックス付け等、N -columnマトリックスを作成し、列は行に等しく設定し、列を含みますn次元配列の各次元の位置。我々はyの各要素の行と列の位置を抽出するrow()col()機能を使用することができます

> row(y) 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 2 2 2 2 
[3,] 3 3 3 3 
> col(y) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] 1 2 3 4 
[3,] 1 2 3 4 

y自体が三次元位置を与えます。それぞれをc()にラップするとベクトルに変換され、cbindとなり、抽出行列が作成されます。

次に、dim<-()という楽しい使い方を1行に収めるだけです。

+0

ありがとう、トーマス。私はあなたの野心が好きです。私はまた、できるだけ基本機能だけを使用するという大きなファンです。しかし、私はあなたの楽しさを薄暗くすることを理解していないと言わざるを得ない。それはどのように機能するのですか?バックチックは何をしていますか? – Atomhamster

+0

@Atomhamster 'dim(x)< - dim(y)'を実行すると、 '' dim < - (x、dim(y)) ''を実行しています。関数。これは、 'dim < - ()'や 'names < - ()'などの関数を使いたいときに便利です。最初に左側のオブジェクトを作成することなく(backticksは '' dim < - () ''関数を直接呼び出すことができますが、このコメントマークアップに書くのは難しいです。) – Thomas

+0

ありがとうございます。このトリックを知ることは非常に面白いです。私はそれが私の機能のいくつかのかなりの数の行を節約することができると思う。 – Atomhamster

関連する問題