2011-09-21 12 views
17

Say mam jakąś matrycę, na przykład:`które()` funkcja wskaźników macierzy

> 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 

Jeśli biegnę which, mam listę prawidłowych indeksów:

> which(m == 1) 
[1] 3 6 9 12 

chcę coś podobnego indeksami macierzy - każdy indeks zawierający liczbę wierszy i kolumn:

 [,1] [,2] 
[1,] 3 1 
[2,] 2 2 
[3,] 1 3 
[4,] 4 3 

tam jest jakąkolwiek prostą funkcję, aby to zrobić? Ponadto powinna ona jakoś zawierać wierszy i kolumn nazwy:

> 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 

ale nie wiem jak teraz, może jak

 [,1] [,2] [,3] [,4] 
[1,] 3 1 c e 
[2,] 2 2 b f 
[3,] 1 3 a g 
[4,] 4 3 d g 

lub może powrócić 2 wektorów (dla wierszy i kolumn), jak

c b a d 
3 2 1 4 

e f g g 
1 2 3 3 
+0

patrz [jeden z moich starszych pytań] (http://stackoverflow.com/q/7204016/709529) –

Odpowiedz

31

na pierwsze pytanie trzeba też zdać arr.ind=T do which:

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

fajne, dzięki! Ja ** patrzyłem na '?, Które' pomagają, ale mówi: * "arr.ind logiczne - czy wskaźniki tablicy powinny zostać zwrócone, gdy x jest tablicą?" *, Co jest dość mylące! Dlaczego mówią o indeksach tablicowych, gdy zwracają wskaźniki macierzy? (Z tablicą, zwykle mam na myśli wektor 1D) – TMS

+0

"tablica" to bardziej ogólny przypadek, w tym "wektory" ze zdegenerowanym wymiarem singletonowym, macierze (z 2 wymiarami) i 3D, 4D, ... tablice - wektory bez wymiar nie jest 1D w tym sensie i pamiętaj, że istnieją również wektory rekurencyjne (lista) – mdsumner

+0

@ TomasT. Tablica może mieć 1, 2 lub więcej wymiarów. Macierz jest szczególnym przypadkiem dwuwymiarowej tablicy. Zobacz '? Macierz' i'? Tablicę'. – Andrie

5

Nie można mieszać numeryczny i alfa w matrycy, ale można w 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