Macierz jest prostokątną ,,strukturą'' zawierającą elementy tego samego typu. Do utworzenia macierzy wykorzystuje się funckję matrix(), która ma następującą składnię:
matrix(data, nrow, ncol)
Argument data oznacza wartości, które chcemy rozmieścić w macierzy — zwykle jest to wektor liczbowy (choć wykorzystuje się czasami macierze znakowe lub logiczne, wówczas data jest wektorem, odpowiednio, znakowym lub logicznym; w niniejszym omówieniu ograniczamy się jednak wyłącznie do macierzy liczbowych). Argument nrow oznacza liczbę wierszy macierzy, zaś ncol liczbę kolumn. Dla przykładu
matrix(data = 1:6, nrow = 2, ncol = 3)
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Komórki macierzy są domyślnie wypełniane kolumnami. Domyślne ustawienie można jednak zmienić za pomocą argumentu dodatkowego byrow w nastepujący sposób:
matrix(data = 1:6, nrow = 2, ncol = 3, byrow = TRUE)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
W pierwszym przykładzie liczby są wpisywane kolumnami począwszy od pierwszej kolumny z lewej strony. W drugim przykładzie liczby wpisywane są do komórek macierzy wierszami począwszy od pierwszego wiersza od góry.
Domyślnie poszczególne wiersze i kolumny tabeli oznaczane są kolejnymi liczbami naturalnymi. Możemy jednak nadać kolejnym wierszom i kolumnom specjalne nazwy. Na przykład:
m <- matrix(data = 1:6, nrow = 2, ncol = 3)
rownames(m) <- c("w1", "w2")
colnames(m) <- c("k1", "k2", "k2")
m
## k1 k2 k2
## w1 1 3 5
## w2 2 4 6
Nazwy wierszom i kolumnom możemy nadać też w następujący sposób:
n <- matrix(data = 1:6, nrow = 2, ncol = 3, dimnames = list(Wiersz = c("w1",
"w2"), Kolumna = c("k1", "k2", "k3")))
n
## Kolumna
## Wiersz k1 k2 k3
## w1 1 3 5
## w2 2 4 6
To ostatnie rozwiązanie jest przydatne wtedy, gdy wiersze i kolumny odpowiadają kategoriom pewnych zmiennych i zależy nam na tym, aby macierz zawierała nazwy zarówno zmiennych, jak i ich kategorii.
Elementy macierzy wybiera się za pomocą dwóch indeksów rozdzielonych przecinkiem i zamieszczonych w nawiasie kwadratowym. Pierwszy indeks wskazuje na numer wiersza, drugi na numer kolumny. Dla przykładu, dana jest następująca macierz:
z <- matrix(data = 1:20, nrow = 4, ncol = 5, dimnames = list(Wiersz = c("w1",
"w2", "w3", "w4"), Kolumna = c("k1", "k2", "k3", "k4", "k5")))
z
## Kolumna
## Wiersz k1 k2 k3 k4 k5
## w1 1 5 9 13 17
## w2 2 6 10 14 18
## w3 3 7 11 15 19
## w4 4 8 12 16 20
Jeśli chcemy wybrać element znajdujący się w drugim wierszu i czwartej kolumnie macierzy z, piszemy:
z[2, 4]
## [1] 14
Jeśli chcemy wybrać elementy znajdujące się w wierszach 2 i 4 oraz w kolumnach 1 i 3, piszemy:
z[c(2, 4), c(1, 3)]
## Kolumna
## Wiersz k1 k3
## w2 2 10
## w4 4 12
Jeśli chcemy wybrać elementy znajdujące się w wierszach od 2 do 4 i w kolumnach od 1 do 3, piszemy:
z[2:4, 1:3]
## Kolumna
## Wiersz k1 k2 k3
## w2 2 6 10
## w3 3 7 11
## w4 4 8 12
Jeśli chcemy wybrać wszystkie elementy z wyjątkiem elementów w 2. wierszu i 4. kolumnie, piszemy:
z[-2, -4]
## Kolumna
## Wiersz k1 k2 k3 k5
## w1 1 5 9 17
## w3 3 7 11 19
## w4 4 8 12 20
Jeśli chcemy wybrać elementy znajdujące w trzecim wierszu, piszemy:
z[3, ]
## k1 k2 k3 k4 k5
## 3 7 11 15 19
Jeśli chcemy wybrać elementy znajdujące się w piątej kolumnie, piszemy
z[, 5]
## w1 w2 w3 w4
## 17 18 19 20
Elementy macierzy możemy też wybierać odwołując się do nazw wierszy i kolumn:
z["w2", "k4"]
## [1] 14
z["w1", ]
## k1 k2 k3 k4 k5
## 1 5 9 13 17
z[, "k4"]
## w1 w2 w3 w4
## 13 14 15 16
Funkcja t() ,,odwraca'' macierz:
t(z)
## Wiersz
## Kolumna w1 w2 w3 w4
## k1 1 2 3 4
## k2 5 6 7 8
## k3 9 10 11 12
## k4 13 14 15 16
## k5 17 18 19 20
Funkcja rowSums() sumuje elementy w wierszach, natomiast funkcja colSums() sumuje elementy w kolumnach.
rowSums(z)
## w1 w2 w3 w4
## 45 50 55 60
colSums(z)
## k1 k2 k3 k4 k5
## 10 26 42 58 74
Funkcja sum() sumuje wszystkie elementy macierzy:
sum(z)
## [1] 210
W macierzy kwadratowej liczba wierszy jest równa liczbie kolumn. Dla takich macierzy istnieje kilka dodatkowych użytecznych funkcji.
w <- matrix(1:9, nrow = 3, ncol = 3)
w
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Funkcja diag() wyświetla elementy na ,,głównej przekątnej'' macierzy — biegnącej od lewego górnego do prawego dolnego rogu.
diag(w)
## [1] 1 5 9
Funkcja upper.tri() oznacza elementy macierzy, które znajdują się powyżej głównej przekątnej:
upper.tri(w)
## [,1] [,2] [,3]
## [1,] FALSE TRUE TRUE
## [2,] FALSE FALSE TRUE
## [3,] FALSE FALSE FALSE
w[upper.tri(w)]
## [1] 4 7 8
Analogicznie, funkcja lower.tri() oznacza elementy macierzy, które znajadują się poniżej głównej przekątnej:
lower.tri(w)
## [,1] [,2] [,3]
## [1,] FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE
## [3,] TRUE TRUE FALSE
w[lower.tri(w)]
## [1] 2 3 6