矩阵中的锯齿形索引

时间:2018-02-23 14:14:52

标签: r matrix indexing subset

我有一个矩阵

mat <- matrix(rep(c("L","R"),5),ncol=2, byrow=TRUE)
cols <- c(1,1,2,1,1)
set.seed(42); test <- rnorm(5)

我想得到

首先,每行中的一个元素和ins cols中的列,产生于此处:

> res
#[1] "L" "L" "R" "L" "L"

其次,选定行中的元素,例如test>0的元素,以及cols[test>0]中的相应列,产生于此处:

> res
#[1] "L" "R" "L" "L"

是否有一些使用cols索引mat的快捷方法?

3 个答案:

答案 0 :(得分:3)

您可以使用矩阵索引:

mat[cbind(1:nrow(mat),cols)][test > 0]

来自?'['的文档:

  

通过[单个参数索引数组时,我可以使用as作为矩阵   许多列,因为有x的尺寸;结果是一个向量   具有与i的每一行中的索引集相对应的元素。

答案 1 :(得分:2)

使用cols索引矩阵的另一种方法是,

diag(mat[,cols])
#[1] "L" "L" "R" "L" "L"

#add the filter,
diag(mat[,cols])[test > 0]
#[1] "L" "R" "L" "L"

注意:正如@digEmAll所提到的,如果原始矩阵有很多行,这将是非常低效的。这是因为它创建了一个nrow(mat) x nrow(mat)矩阵以获得对角线

答案 2 :(得分:1)

mat <- matrix(rep(c("L","R"),5),ncol=2, byrow=TRUE)                  
cols <- c(1,1,2,1,1)                                                 
set.seed(42); (test <- rnorm(5))                                       
#> [1]  1.3709584 -0.5646982  0.3631284  0.6328626  0.4042683

不确定为什么我会得到四个元素&gt;当你有三个时,你就是0。总之...

sapply(seq_along(1:nrow(mat)), function(i) mat[i, cols[i]])          
#> [1] "L" "L" "R" "L" "L"
sapply(seq_along(1:nrow(mat)), function(i) mat[i, cols[i]])[test > 0]
#> [1] "L" "R" "L" "L"

但是矩阵索引要快得多,并且 答案。