【问题标题】:Get indices of rows whose elements equal x at all columns indicated by a vector, in R获取在 R 中由向量指示的所有列的元素等于 x 的行的索引
【发布时间】:2016-08-28 19:53:01
【问题描述】:

让我们有一个矩阵M,例如

> M
     [,1] [,2] [,3] [,4]
[1,]   15    0    0    9
[2,]    0    1    8   24
[3,]    4    0    0    0
[4,]    3    2    0    0
[5,]    0    0   56    0

其列索引的向量ind,例如

> ind=c(2,4)
> ind
[1] 2 4

和一个值x,例如x=0.

如何获取矩阵M的行索引,其在ind表示的所有列的元素都等于x

以下代码返回正确的行索引:

> which(M[,2]==0 & M[,4]==0)
[1] 3 5

但我需要一个使用矢量ind 的解决方案,可能很长。我试过了:

> which(M[,ind]==0)
[1]  1  3  5  8  9 10

但我得到的条目在ind 指示的任一列中都为零,而不是同时在所有列中。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    怎么样

    rowSums(M[, ind] == 0) == length(ind)
    # [1] FALSE FALSE  TRUE FALSE  TRUE
    

    让我们逐步分解代码:

    • M[, ind] == 0 - 获取一个逻辑矩阵,显示 M[, ind] 的位置为零
    • rowSums(.) - 确定每行中有多少 TRUE 值
    • . == length(ind) - 将其与使用的列数进行比较

    如果您需要数字索引,请将其包装在 which() 中。

    which(rowSums(M[, ind] == 0) == length(ind))
    # [1] 3 5
    

    数据:

    M <- structure(c(15L, 0L, 4L, 3L, 0L, 0L, 1L, 0L, 2L, 0L, 0L, 8L, 
    0L, 0L, 56L, 9L, 24L, 0L, 0L, 0L), .Dim = c(5L, 4L), .Dimnames = list(
        NULL, c("V1", "V2", "V3", "V4")))
    ind <- c(2, 4)
    

    【讨论】:

    • 需要稍作改进,以便解决方案适用于ind向量长度为​​1的情况:which(rowSums(M[, ind, drop=FALSE] == 0) == length(ind))
    【解决方案2】:

    如果 ind 应该是一个向量,那么你应该引用它的元素,而不是整个东西。例如:

    ind = c(2,4)
    
    x = 0
    
    M = the matrix
    
    which(M[,ind[1]] == x & M[,ind[2]] == x)
    

    此答案假定您提前知道 要搜索多少列

    【讨论】:

    • 谢谢,这是一个改进,但就我而言,我事先对 M、ind 或 x 一无所知。
    【解决方案3】:

    我们也可以用rowSums取反得到索引

    which(!rowSums(M[, ind]!=0))
    #[1] 3 5
    

    如果我们分解步骤

    rowSums(M[, ind]!=0)
    #[1] 1 2 0 1 0
    

    第 3 和第 4 个元素是唯一没有任何非零值的元素,因此 rowSums 为它返回 0。否定输出返回 TRUE 为 0 和 FALSE 为所有其他

    !rowSums(M[, ind]!=0)
    #[1] FALSE FALSE  TRUE FALSE  TRUE
    

    现在,用 which 包装返回 TRUE 元素的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      相关资源
      最近更新 更多