私は、3 つの空間次元と時間次元 (x、y、z、t) で構成される 4 次元配列で構成される R のデータに取り組んでいます。いくつかの分析では、一連の空間座標 x、y、z の時間次元のすべてのデータを取得したいと考えています。ここまでは、 which 関数を使用して、対象の空間位置のインデックスを取得しました。しかし、空間位置に対応する時間次元ですべての関連データを取得しようとすると、洗練された R ソリューションを見つけることができず、移植された MATLAB 関数である repmat を使用することになりました。
a4d <- array(rnorm(10000), rep(10,4)) #x, y, z, t
#arbitrary set of 3d spatial indices x, y, z (here, using high values at first timepoint)
indices <- which(a4d[,,,1] > 2, arr.ind=TRUE)
str(indices)
# int [1:20, 1:3] 10 2 6 5 8 2 6 8 2 10 ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:3] "dim1" "dim2" "dim3"
#Now, I would like to use these indices to get data x, y, z for all t
#Intuitive, but invalid, syntax (also not clear what the structure of the data would be)
#a4d[indices,]
#Ugly, but working, syntax
library(pracma)
#number of timepoints
nt <- dim(a4d)[4]
#create a 4d lookup matrix
lookup <- cbind(repmat(indices, nt, 1), rep(1:nt, each=nrow(indices)))
#obtain values at each timepoint for indices x, y, z
result <- cbind(lookup, a4d[lookup])
このソリューションは、指定された目的には問題なく機能しますが、概念的には醜いようです。理想的には、最後に 2 次元の行列 (インデックス x 時間) が必要です。したがって、この場合、ルックアップに 20 個の x、y、z 座標、および 10 個のタイムポイントがある場合、行がインデックスの各行を表す 20 x 10 行列が理想的です (x、y、z を保持する必要はありません)。 、値は必ず)、各列は時点です。
Rでこれを行う良い方法はありますか? do.call("[", list ... などをいじり、outer と prod を使用しましたが、期待どおりに機能しませんでした。
ご提案ありがとうございます。マイケル