【问题标题】:Subsetting a matrix with another matrix in R用R中的另一个矩阵对矩阵进行子集
【发布时间】:2020-03-07 12:08:19
【问题描述】:

我有两个矩阵,一个具有感兴趣的值,另一个具有对应于第一个列的索引。下面的代码可以满足我的要求,但它需要在更大的矩阵上运行很多次。我的直觉告诉我,可能有更快的方法来实现这一点,所以任何想法都会受到赞赏。

set.seed(0)
y = matrix(runif(20), 4, 5)
idx = matrix(sample(1:5, 12, replace = T), 4, 3)
z = lapply(1:nrow(y), function(i) y[i, idx[i,]])
z = do.call(rbind, z)

【问题讨论】:

    标签: r matrix subset


    【解决方案1】:

    1) 创建一个两列矩阵,其元素是idx 中每个条目的行号和idx 值,并为其下标y。然后再整形回idx的尺寸。

    matrix(y[cbind(c(row(idx)), c(idx))], nrow(idx))
    

    2)它的一个变体是:

    zz <- idx
    zz[] <- y[cbind(c(row(idx)), c(idx))]
    
    # check that result is the same as z in question
    identical(zz, z)
    ## [1] TRUE
    

    【讨论】:

    • 这个解决方案是我做的测试中的禁食。达伦的回答也很接近。
    【解决方案2】:

    您可以将矩阵和索引转换为向量、子集、重建矩阵。

    matrix(as.vector(t(y))[as.vector(t(idx+(1:(nrow(y))-1)*ncol(y)))],nrow(y),b=T)
    #           [,1]      [,2]      [,3]
    # [1,] 0.8966972 0.8966972 0.9082078
    # [2,] 0.7176185 0.7176185 0.2655087
    # [3,] 0.9919061 0.9919061 0.3841037
    # [4,] 0.5728534 0.9446753 0.5728534
    

    【讨论】:

      【解决方案3】:

      转置y 并调整idx 中的索引。

      array(t(y)[idx + (1:nrow(y) - 1) * ncol(y)], dim(idx))
      
      #           [,1]      [,2]      [,3]
      # [1,] 0.8966972 0.8966972 0.9082078
      # [2,] 0.7176185 0.7176185 0.2655087
      # [3,] 0.9919061 0.9919061 0.3841037
      # [4,] 0.5728534 0.9446753 0.5728534
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 2018-08-07
        • 2011-02-10
        • 2016-12-25
        • 1970-01-01
        相关资源
        最近更新 更多