たとえば、いくつかのマトリックスがあるとします。
> m = matrix(rep(c(0, 0, 1), 4), nrow = 4)
> m
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 0 1 0
[3,] 1 0 0
[4,] 0 0 1
which
を実行すると、通常のインデックスのリストが取得されます。
> which(m == 1)
[1] 3 6 9 12
私は行列インデックスのようなものを取得したい-各インデックスには行と列の番号が含まれています:
[,1] [,2]
[1,] 3 1
[2,] 2 2
[3,] 1 3
[4,] 4 3
これを行う簡単な関数はありますか?さらに、行と列の名前を何らかの形で含める必要があります。
> rownames(m) = letters[1:4]
> colnames(m) = letters[5:7]
> m
e f g
a 0 0 1
b 0 1 0
c 1 0 0
d 0 0 1
でも今は好きじゃない
[,1] [,2] [,3] [,4]
[1,] 3 1 c e
[2,] 2 2 b f
[3,] 1 3 a g
[4,] 4 3 d g
または、(行と列の)2つのベクトルを返すかもしれません。
c b a d
3 2 1 4
e f g g
1 2 3 3
最初の質問では、arr.ind= TRUE
をwhich
にも渡す必要があります。
> which(m == 1, arr.ind = TRUE)
row col
[1,] 3 1
[2,] 2 2
[3,] 1 3
[4,] 4 3
マトリックスでは数値とアルファを混在させることはできませんが、data.frameでは可能です。
> indices <- data.frame(ind= which(m == 1, arr.ind=TRUE))
> indices$rnm <- rownames(m)[indices$ind.row]
> indices$cnm <- colnames(m)[indices$ind.col]
> indices
ind.row ind.col rnm cnm
c 3 1 c e
b 2 2 b f
a 1 3 a g
d 4 3 d g