R中矩阵的每行索引(包括0行)

时间:2017-01-25 23:04:12

标签: r matrix indexing

假设我们在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)中的行数相同数量的元素的向量,并且每个元素包含具有逻辑值的ATRUE。对于上面的AB应该类似于

B <- c(3,2,0,1)
# [1] 3 2 0 1

其中0表示没有TRUE值的行。

我最接近的是applywhich行:

unlist(apply(A, 1, function(x) which(x)))
# [1] 3 2 1

但是,结果会跳过0,我不确定这对大型矩阵的效率如何(比如说~100K x 100个条目)。

2 个答案:

答案 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