Rodzaje obiektów w R, cz. III

Macierze i tablice

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.

Nadawanie nazw wierszom i kolumnom

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.

Wybieranie elementów macierzy

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 

Kilka użytecznych funkcji

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

Macierze kwadratowe

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