r - 使用 col 行索引从矩阵中提取值

标签 r matrix indexing

假设我有两个矩阵:

> 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

ab 中的行数相同。我正在寻找一种矢量化方法,逐行地从 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/

相关文章:

正则表达式查找包含空格和标点符号的精确匹配

c++ - 为矩阵分配新内存

python - 如何删除列表形式的数据帧的重复索引?

sql-server - 创建索引时崩溃

r - 在 R 中向绘图添加新曲线时调整 x 和 y 轴的限制

r - 虚拟变量和预处理

r - 我如何计算超过 R 中的值需要多少天?

python - 未正确附加矩阵

c++ - 有没有办法在 gdb 中打印 Armadillo 矩阵?

mysql - 为什么 MySQL 不使用索引来连接单列(没有 where 或 group by)?