2012-08-16 98 views
7

有沒有一種方法可以一次從矩陣中選擇一組預先指定的元素?具體而言,假設我有以下矩陣:R一次從矩陣中選擇特定元素

 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)]。

但是,從稍後閱讀代碼來看,這不是很清楚。有沒有辦法一次輸入實際(行,列)引用?

謝謝!

+0

as.vector(mymatrix [c(1,2,3,4,5),c(2,3,5,6)])(mymatrix [行,列]) – dickoa 2012-08-16 19:12:19

回答

12

索引可以用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 
+0

我在想他想要一個任意的x-y對的解決方案。猜測:縮減矩陣的diag()方法可能比我的row == col + 1方法更快。 – 2012-08-16 19:21:53

+0

我對自己造就的一般情況感興趣。但是,對於我所看到的問題,診斷方法很有用。謝謝你們倆! – user1357015 2012-08-16 19:25:00

8

一個解決您的具體情況是選擇子矩陣,並使用diag功能:

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

** I **發現比索引更「可讀」,但我相信我處於少數。 – joran 2012-08-16 19:15:53

+1

是啊,@joran,我一開始並沒有得到它,但現在被鼓勵再看一次後,我看到了什麼發生。可能相當有效 – 2012-08-16 19:23:45

3

類似的解決方案,以上張貼,但處理的情況有一個向量的行和列向量(這是我的問題,當我來到這個線程)的情況如下:

> 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