2012-03-29 5 views
14

私は行列mdatを持っていて、インデックス番号しか知りません。列名と行名を取得するにはどうすればよいですか?例:あなたは、あなたの質問に表示されて何の名前を持っていない1要素ベクトルで行列最初の結果を、サブセット化行列のインデックス値で行列の列と行の名前を取得するにはどうすればよいですか?

> 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を使用してそのインデックスの行と列を取得する必要があります。あなたはその後、mapplyを使用して、行と列の名前を一度に

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

または両方の要素を取得することにより、右の名前を取得することができます

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

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

もう一度この答えを読んで、 'arr.ind = TRUE'なしで' which'を実行したため、OPには全体のインデックスしかないのだろうかと思います。将来の読者: 'which'からそのインデックスを取得している場合は' arrayInd'を使う代わりに 'arr.ind = TRUE'を使って行と列のインデックスを取得してください。 – Aaron

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