假设我有一个dim(x) <- c(3,3,3)
数组。我还有一个df矩阵,它有两列,包含我需要的索引组合。
当我通过x[df[[1]],df[[2]],]
时,我得到一个非常大的数组,然后我需要通过并使用apply函数的对角线。这是非常低效的内存和时间。是否有某种快捷方式(不使用for
循环)来索引数组,以便它返回df
请求的值向量。
小例子:
`a <- array(1:27,dim = c(3,3,3))
df <- data.frame(c(1,2,2,1,3,2),c(2,3,2,1,3,2))`
在这个例子中,我想传递一些类似"a[df[[1]],df[[2]],]
"的东西然后得到像这样的(或转置):
. [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 4 8 5 1 9 5
[2,] 13 17 14 10 18 14
[3,] 22 26 23 19 27 23
当我现在传递这个函数时,我得到一个三维的dim = c(6,6,3)
数组,而不是更有用的dim = c(6,3)
数组。我可以很容易地采取apply(result, 3,diag)
得到我想要的,但当df>>6它占用了大量的空间(如750GB的空间,并抛出警告,错误和开始前停止执行)
可以了
temp <- array(1:27, dim=c(3,3,3))
df <- data.frame(a=c(1,2,3), b=c(1,2,3), c=c(1,2,3))
temp[cbind(df[[1]], df[[2]], df[[3]])]
[1] 1 14 27
这有时被称为矩阵索引。
要查询两个维度,并保留第三个维度,您可能只使用常规矩阵子集:例如,为每个"z"维度矩阵选择第一,第二行和第二列,您可以使用temp[1:2, 2,]
或从您的数据集:
temp[1:2, 2,]
[,1] [,2] [,3]
[1,] 4 13 22
[2,] 5 14 23
temp[df[[1]][1:2], df[[2]][2], ]
[,1] [,2] [,3]
[1,] 4 13 22
[2,] 5 14 23
当然是一样的