首页 文章

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

提问于
浏览
0

假设我们在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 . 对于上面的 AB 应该类似

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

  • 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

    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
    

相关问题