2012-03-29 124 views
14

所以我們假設我有一個矩陣,mdat和我只知道索引號。我如何檢索列名和行名?例如:如何通過矩陣索引值檢索矩陣列和行名稱?

> mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3, byrow=TRUE, 
    dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3"))) 
> mdat[4] 
[1] 12 
> names(mdat[4]) 
NULL 
> colnames(mdat[4]) 
NULL 
> rownames(mdat[4]) 
NULL 
> dimnames(mdat[4]) 
NULL 

回答

21

首先,您需要使用arrayInd獲取該索引的行和列。

k <- arrayInd(4, dim(mdat)) 

您可以通過獲取的行和列名

rownames(mdat)[k[,1]] 
colnames(mdat)[k[,2]] 

或兩者的該元素在一次使用mapply然後得到正確的名稱:

mapply(`[[`, dimnames(mdat), k) 
+4

在再次閱讀這個答案,我想知道OP是否只有總體索引,因爲他們在沒有'arr.ind = TRUE'的情況下運行'which'。未來的讀者:如果你從'which'獲得該索引,使用'arr.ind = TRUE'獲取行和列索引,而不是使用'arrayInd'。 – Aaron 2012-11-30 20:35:02

6

子集在一個沒有名字,因爲你在你的問題顯示出一個元素向量矩陣第一批成果。請記住,子集通過複製來創建一個全新的對象。在子集化之後,沒有辦法參考原始mdat

如果將子集的結果分配給另一個對象,則更加清楚。

> m <- mdat[4] 
> m 
[1] 12 
> names(m) # no names were printed above... so 
NULL 

你真的想先進入行/列名和其子集他們

> colnames(mdat)[3] 
[1] "C.3" 
> rownames(mdat)[2] 
[1] "row2" 

您可以重新分配列/行名稱相似。

> colnames(mdat)[3] <- "C3" 
> rownames(mdat)[2] <- "row.2" 
> mdat 
     C.1 C.2 C3 
row1 1 2 3 
row.2 11 12 13