2011-09-21 82 views
17

说我有一些基质,例如:'这()`函数矩阵指数

> 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 

Is there任何简单的功能来做到这一点?此外,它应该以某种方式包含的行和列名:

> 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 
+0

见[我的旧的问题之一(http://stackoverflow.com/q/7204016/709529) –

回答

31

关于第一个问题,你还需要通过arr.ind=Twhich

> which(m == 1, arr.ind=T) 
    row col 
[1,] 3 1 
[2,] 2 2 
[3,] 1 3 
[4,] 4 3 
+0

很酷,谢谢!我* **在看''哪个'帮助,但它说:*“arr.ind逻辑 - 数组索引是否在x是一个数组时返回?”*,这相当混乱!为什么他们在返回矩阵指数时谈到数组指数? (有阵列,通常意味着一维向量) – TMS

+0

“阵列”是更一般的情况,包括具有退化单独维度,矩阵(具有2维)和3D,4D,...阵列的向量,在这个意义上,维度不是1D,记住还有递归向量(列表) – mdsumner

+0

@TomasT。一个数组可以有1,2个或更多维度。矩阵是二维数组的特例。参见'?matrix'和'?array'。 – Andrie

5

不能混合数字和字母的矩阵,但你可以在一个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