【发布时间】:2016-12-29 17:27:20
【问题描述】:
这可能是相当基本的,但我还没有找到一个简单的解决方案。
假设我有一个三维矩阵:
m <- array(seq_len(18),dim=c(3,3,2))
我想用索引数组对矩阵进行子集化:
idxrows <- c(1,2,3)
idxcols <- c(1,1,2)
获取位置(1,1),(2,1)和(3,2)的数组,即:
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 10 14 18
我尝试过m[idxrows,idxcols,],但没有任何运气。
有没有办法(显然不使用 for 循环)?
【问题讨论】:
-
可以说使用循环,至少对于快速应用也是一种选择,并且易于概括:
x <- integer(0L)for (i in 1:length(idxrows)) {x[i] <- m[idxrows[i], idxcols[i]]} -
结果和使用一样:
cbind(m[idxrows[1],idxcols[1],], m[idxrows[2],idxcols[2],], m[idxrows[3],idxcols[3],]) -
也许你有错字。 idxcols 应该是 c(1,2,3) 吗?您可以通过 r 绑定数组中 z 维矩阵的对角线来获得所需的输出:
rbind(diag(m[,,1]), diag(m[,,2])). -
mapply和lapply都是循环,但是对于不同的声音sapply(seq_along(idxrows), function(i) m[idxrows[i], idxcols[i],])