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

时间:2012-08-16 19:05:48

标签: r matrix

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

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

答案 0 :(得分: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

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

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

> 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