假设我们在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
按which
行:
unlist(apply(A, 1, function(x) which(x)))
# [1] 3 2 1
但是,结果会跳过0
,我不确定这对大型矩阵的效率如何(比如说~100K x 100个条目)。
答案 0 :(得分:2)
这是一个更符合您如何开始的精神的解决方案,但您必须欣赏@ rawr的聪明解决方案。
A <- matrix(as.logical(c(0,0,0,1,0,1,0,0,1,0,0,0)), nrow=4)
TrueSpots = apply(A, 1, which)
TrueSpots[!sapply(TrueSpots, length)] = 0
unlist(TrueSpots)
[1] 3 2 0 1
更新包括@ akrun的建议:
TrueSpots = apply(A, 1, which)
TrueSpots[!lengths(TrueSpots)] = 0
unlist(TrueSpots)
[1] 3 2 0 1
答案 1 :(得分:1)
max.col(A)
标识行中发生最大条目的索引。领带随机破坏(默认情况下)。逻辑矩阵上的rowSums(A)
执行每行二进制加法。
基于每行最多有一个TRUE
值的假设,rowSums(A)
将产生二进制向量。执行基于矢量的乘法会使A中的真实FALSE
行无效。
> A <- matrix(as.logical(c(0,0,0,1,0,1,0,0,1,0,0,0)), nrow=4)
> max.col(A)*rowSums(A)
[1] 3 2 0 1