Функция which () для матричных индексов - PullRequest
31 голосов
/ 22 сентября 2011

Скажем, у меня есть матрица, например:

> 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

Ответы [ 2 ]

49 голосов
/ 22 сентября 2011

Для первого вопроса вам также нужно передать arr.ind= TRUE на which:

> which(m == 1, arr.ind = TRUE)
     row col
[1,]   3   1
[2,]   2   2
[3,]   1   3
[4,]   4   3
5 голосов
/ 22 сентября 2011

Вы не можете смешивать цифры и буквы в матрице, но вы можете в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...