首页 文章

R一次从矩阵中选择特定元素

提问于
浏览
9

有没有办法可以从矩阵中一次性选择一堆预先指定的元素?具体来说,假设我有以下矩阵:

58        59        60       62        63        64
58  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
59  3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
60  6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
62  8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
63 12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
64 13.401126 11.664533 11.991269 6.762802  3.796884  0.000000

我想选择细胞[1,2],[2,3],[3,4],[4,5],[5,6] . 我意识到我可以通过索引引用它们,在这种情况下我可以运行:

myMatrix的[C(2,9,16,23,30) .

但是,稍后阅读代码并不是很清楚 . 有没有办法可以一次输入实际(行,列)参考?

谢谢!

3 回答

  • 15

    索引可以使用2列矩阵完成 . 将这些行和列编号转换为有效的R对象(而不是Matlab样式的表达式):

    > idxs <- gsub("\\]",")", gsub("\\[", "c(",  "[1,2], [2,3], [3,4], [4,5] ,[5,6]") )
    # I edited the string value that idxs returned:
    > midx <- rbind( c(1,2), c(2,3), c(3,4), c(4,5) ,c(5,6) )
    > mat <-  matrix(scan(), nrow=6)  
    1:  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
    7:   3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
    13:   6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
    19:   8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
    25:  12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
    31:  13.401126 11.664533 11.991269 6.762802  3.796884  0.000000
    37: 
    Read 36 items
    > mat[midx]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    

    如果你的目标是索引可以更普遍地完成的超对角线:

    > mat[col(mat)==row(mat)+1]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    
  • 8

    针对您的具体情况的解决方案是选择子矩阵并使用 diag 函数:

    R> diag(x[-ncol(x),-1])
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    
  • 4

    与上面发布的类似的解决方案,但是处理行的向量和列的向量(这是我遇到此线程时的问题)的情况如下:

    > rows <- c(1,2,3,4,5)
    > cols <- c(2,3,4,5,6)
    > call <- cbind(rows,cols)
    > 
    > mat[call]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    

相关问题