我在R中有一个三维数组,例如
a <- array(1:24, dim=c(2,3,4))
我将这个数组的维度称为行,列和层。 我有第二个变量 b ,用于为该数组提供索引,例如
b <- array(c(1,4,3,2,2,1), dim=c(2,3))
我想获得一个二维变量 d ,其中包含 b 指定的图层中3D变量 a 的值对于 a 和 b 中的每一行和每列。例如,d[1, 1] <- a[1, 1 , b[1, 1]]
和d[2, 3] <- a[2, 3, b[2, 3]]
等等。在这个例子中,我最终应该:
d == array(c(1, 20, 15, 10, 11, 6), dim=c(2, 3))
最有效的方法是什么?
答案 0 :(得分:2)
你能做到这一点的最快方法:
structure(a[cbind(c(row(b)),c(col(b)),c(b))],.Dim=dim(b))
[,1] [,2] [,3]
[1,] 1 15 11
[2,] 20 10 6
答案 1 :(得分:1)
我们可以使用expand.grid
获取b
中所有行和列的组合,然后使用mapply
使用索引从a
获取相应的输出。我们使用relist
使d
矩阵与b
相同。
df <- expand.grid(row = 1:nrow(b), col = 1:ncol(b))
d <- relist(mapply(function(x, y) a[x, y, b[x, y]], df$row, df$col), b)
d
# [,1] [,2] [,3]
#[1,] 1 15 11
#[2,] 20 10 6
其中df
是
row col
#1 1 1
#2 2 1
#3 1 2
#4 2 2
#5 1 3
#6 2 3
答案 2 :(得分:1)
我建议同时使用float **values
,但我会生成一个索引矩阵,以便同时对expand.grid
的每个条目进行地址处理。
a
我认为稍微更有效