如何动态索引多维R数组?

时间:2012-07-17 01:42:30

标签: r multidimensional-array

我正在研究R中的一些数据,这些数据由四维数组组成,包括三个空间维度和时间维度:x,y,z,t。对于我的一些分析,我想获得一组空间坐标x,y,z的时间维度中的所有数据。到目前为止,我已经使用哪个函数来获得感兴趣的空间位置的索引。但是当我去获取与空间位置相对应的时间维度中的所有相关数据时,我找不到优雅的R解决方案,并且已经使用了repmat,一个移植的MATLAB函数。

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])

此解决方案适用于所述目的,但在概念上看起来很难看。理想情况下,我想在最后得到一个二维矩阵:索引x时间。因此,在这种情况下,在查找中使用20 x,y,z坐标,以及10个时间点,20 x 10矩阵将是理想的,其中行表示每行索引(不需要保留x,y,z ,值必然),每列都是一个时间点。

在R中有一个很好的方法吗?我玩过do.call(“[”,列表...... 使用外部和产品,但这些并没有像我希望的那样有效。

感谢您的任何建议! 迈克尔

3 个答案:

答案 0 :(得分:7)

我认为你在寻找:

apply(a4d, 4, `[`, indices)

并检查我们的结果是否匹配:

result1 <- matrix(result[,5], ncol = 10)
result2 <- apply(a4d, 4, `[`, indices)
identical(result1, result2)
# [1] TRUE

答案 1 :(得分:1)

我可能遗漏了一些东西,但你不是只想要a4d[indices[,1],indices[,2],indices[,3],]吗?

答案 2 :(得分:1)

每个维度单独访问不能像@ tilo-wiklund那样工作或我期望。而不是跨10个时间步长的23行,结果是10个时间步长的23x23x23立方体。

r.idvdim <- a4d[indices[,1],indices[,2],indices[,3],]
r.apply  <- apply(a4d, 4, `[`, indices)
r.cbind  <- matrix(a4d[lookup],ncol=nt)

dim(r.idvdim)     # [1] 23 23 23 10
dim(r.apply)      # [1] 23 10
dim(r.cbind)      # [1] 23 10