我有一个矩阵
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
的快捷方法?
答案 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"
但是矩阵索引要快得多,并且 答案。