假设我有两个矩阵:
> a
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 6 10 5 7 2 2 6
[2,] 10 6 7 7 4 3 12
[3,] 11 10 2 10 6 11 9
和
> b
[,1] [,2] [,3]
[1,] 4 1 4
[2,] 3 6 3
[3,] 2 5 2
a
和b
中的行数相同。我正在寻找一种矢量化方法,逐行地从 a
中提取由 b
中的列号指示的项目。因此,结果 c
应该如下所示:
> c
[,1] [,2] [,3]
[1,] 7 6 7
[2,] 7 3 7
[3,] 10 6 10
a[,b[1,]]
或 a[,b[2,]]
或 a[,b[3,]]
仅设法分别获得第 1、2 和 3 行的正确结果。这完全可以用一个简单的矩阵函数来完成吗? apply
有必要吗?
我已尝试在 Index values from a matrix using row, col indicies 中针对类似问题采用解决方案但是不明白这里是怎么用cbind来提取矩阵元素的。
最佳答案
你可以试试
t(sapply(seq_len(nrow(a)), function(i) a[i, b[i, ]]))
# [,1] [,2] [,3]
# [1,] 7 6 7
# [2,] 7 3 7
# [3,] 10 6 10
您可能会看到上面的 sapply
解决方案与 vapply
相比,速度略有提高
s <- seq_len(nrow(a))
t(vapply(s, function(i) a[i, b[i, ]], numeric(ncol(b))))
# [,1] [,2] [,3]
# [1,] 7 6 7
# [2,] 7 3 7
# [3,] 10 6 10
或者for
循环解决方案是
m <- matrix(, nrow(b), ncol(b))
for(i in seq_len(nrow(a))) { m[i, ] <- a[i, b[i, ]] }
m
# [,1] [,2] [,3]
# [1,] 7 6 7
# [2,] 7 3 7
# [3,] 10 6 10
关于r - 使用 col 行索引从矩阵中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27596092/