假设我们在R中有以下逻辑矩阵:
A <- matrix(as.logical(c(0,0,0,1,0,1,0,0,1,0,0,0)), nrow=4)
# [,1] [,2] [,3]
# [1,] FALSE FALSE TRUE
# [2,] FALSE TRUE FALSE
# [3,] FALSE FALSE FALSE
# [4,] TRUE FALSE FALSE
我想将此矩阵转换为使用的列式索引
B <- column_wise_index(A)
其中 column_wise_index
返回一个向量,该向量包含与 A
(4)中的行数相同的元素数,并且每个元素包含 A
列,其逻辑值为 TRUE
. 对于上面的 A
, B
应该类似
B <- c(3,2,0,1)
# [1] 3 2 0 1
其中 0
表示没有 TRUE
值的行 .
我最接近的是 apply
ing which
by row:
unlist(apply(A, 1, function(x) which(x)))
# [1] 3 2 1
但是,结果会跳过 0
,我不确定这对大型矩阵有多高效(比如~100K x 100个条目) .
2 回答
这是一个更符合您如何开始的精神的解决方案,但您必须欣赏@ rawr的聪明解决方案 .
更新包括@ akrun的建议:
max.col(A)
标识行内发生最大条目的索引 . 领带随机破坏(默认情况下) .rowSums(A)
在逻辑矩阵上执行每行二进制加法 .基于每行最多有一个
TRUE
值的假设,rowSums(A)
将产生二进制向量 . 执行基于矢量的乘法会使A中真正的FALSE
行无效 .