Práce s maticemi v R

Z WikiSkript

Matice (matrix) je dvojrozměrným polem, které obsahuje prvky stejného datového typu. Všechny sloupce matice mají shodnou délku a také všechny řádky matice mají shodnou délku.

Vytvoření a rozšíření matice[upravit | editovat zdroj]

Matice je v matematice schéma nějakých matematických objektů – prvků matice. Můžeme si tedy vytvořit matici písmen:

Jdeme na to. Matice se vytvoří příkazem matrix(). Jako první parametr vektor obsahující všechny prvky matice. Parametr nrow udává počet řádků matice, parametr ncol udává počet sloupců matice. V základu se matice vytvoří ze zadaného vektoru po sloupcích. Pokud chceme mít písmena v řádcích, musíme dodat ještě parametr byrow s logickou hodnotou TRUE.

# matice se vytváří příkazem matrix()
# vestavěný vektor "letters" obsahuje malá písmena anglické abecedy
# 1:12 je zkratka pro c(1, 2, 3, …, 11, 12)
# letters[1:12] tedy vypíše prvních dvanáct písmen abecedy
C <- matrix(letters[1:12], nrow = 3, byrow = TRUE)

# vypíšeme výsledek
C
#>      [,1] [,2] [,3] [,4]
#> [1,] "a"  "b"  "c"  "d" 
#> [2,] "e"  "f"  "g"  "h" 
#> [3,] "i"  "j"  "k"  "l" 

# je to matice?
is.matrix(C)
#> [1] TRUE

# jaké prvky obsahuje?
mode(C)
#> [1] "character"

# příkaz str(…) nám dokáže stručně vypsat proměnnou
str(C)
#>  chr [1:3, 1:4] "a" "e" "i" "b" "f" "j" "c" "g" "k" "d" "h" "l"

# je to tedy matice 3 řádky x 4 sloupce a po sloupcích obsahuje písmena v uvedeném pořadí

# jaké jsou rozměry matice C?
dim(C)
#> [1] 3 4

# je to vlastně vektor c(3, 4), který můžeme využít ve výpočtech
dim(C) == c(3, 4)
#> [1] TRUE TRUE

# dvojnásobně potvrzená pravda!

Přidávání či ubírání sloupců a řádků se provádí příkazy rbind() (pro řádky, r jako row) a cbind (pro sloupce, c jako column).

Pokud chceme řádky nebo sloupce odebrat, použijeme negativní index (případně vektor s negativními indexy).

# přidání řádku c("x", "x", "x", "x") k matici C
rbind(C, c("x", "x", "x", "x"))
#>      [,1] [,2] [,3] [,4]
#> [1,] "a"  "b"  "c"  "d" 
#> [2,] "e"  "f"  "g"  "h" 
#> [3,] "i"  "j"  "k"  "l" 
#> [4,] "x"  "x"  "x"  "x" 

# přidání sloupce c("x", "x", "x")  k matici C
cbind(C, c("x", "x", "x"))
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,] "a"  "b"  "c"  "d"  "x" 
#> [2,] "e"  "f"  "g"  "h"  "x" 
#> [3,] "i"  "j"  "k"  "l"  "x"

# DŮLEŽITÉ: pokud výsledek příkazu nepřiřadíte nějaké proměnné,
# pak budou nové řádky nebo sloupce jen v aktuálním výstupu do konzole,
# pokud chcete výstup uložit do matice C, je nutné řádek začít třeba:
# C <- rbind(…)

C[-1, ]     # odebrání 1. řádku matici C
C[, -2]     # odebrání 2. sloupce matici C
C[-1:-2, ]  # odebrání prvních dvou řádků matice C

Pojmenování řádků a sloupců matice[upravit | editovat zdroj]

Někdy se hodí sloupce a řádky v matici pojmenovat. Pak se na jednotlivé prvky můžeme odkazovat mnohem pohodlněji. Jmenovky sloupcům přiřazuje příkaz colnames(), řádkům pak příkaz rownames(). Jmenovky můžeme odstranit příkazem unname().

# přidáme jmenovky sloupcům
colnames(C) <- c("c1", "c2", "c3", "c4")

# přidáme jmenovky řádkům
rownames(C) <- c("r1", "r2", "r3") 

# smažeme všechny jmenovky: tektokrát musíme výsledek přiřadit zpátky do proměnné
C <- unname(C)

# jiným způsobem založíme nové jmenovky příkazem dimnames(),
# kam můžeme napsat řádky i sloupce v jednom seznamu vektorů :-)
dimnames(C) <- list(  c("r1", "r2", "r3"),  c("c1", "c2", "c3", "c4")  )

# na prvek 2. řádku 3. sloupce se můžeme odkázat jmenovkou
C["r2", "c3"]

Adresace a výpis prvků[upravit | editovat zdroj]

Jak se odkážeme na nějaký konkrétní prvek matice, případně na konkrétní oblast matice? Je to podobné jako u vektorů: většinu práce zvládnou hranaté závorky za jménem matice.

# zopakujeme si naši matici i se jmenovkami
C <- matrix(letters[1:12], nrow = 3, byrow = T, dimnames = list( c("r1", "r2", "r3"), c("c1", "c2", "c3", "c4")))

# zobrazíme prvek 2. řádku, 3. sloupce
C[2, 3]
#> [1] "g"

# zobrazíme prvek 2. řádku, 3. sloupce pomocí jmenovek
C["r2", "c3"]
#> [1] "g"

# zobrazíme celý první řádek
C[1, ]
#>  c1  c2  c3  c4 
#> "a" "b" "c" "d"

# je to tedy vektor c("a", "b", "c", "d") s popisky

# zobrazíme celý třetí sloupec
C[ , 3]

# zobrazíme submatici sestívající z 1. a 3. řádku a 2. a 4. sloupce s popisky
C[c(1, 3), c(2, 4)]


# chceme zobrazit prvek vpravo dole a nevíme, jak je matice velká?
# příkaz dim(…) zjistí rozměry matice a vrátí vektor c(řádky, sloupce)
# na návratovou hodnotu se pak můžeme odkazovat při hledání prvku vpravo dole:
C[dim(C)[1], dim(C)[2]]

# chceme pátý prvek v pořadí, jdeme po sloupcích
C[5]
#> [1] "f"

# chceme osmý a devátý prvek v pořadí (po sloupcích)
C[c(8, 9)]
#> [1] "g" "k"

C[13]                    # NA
diag(C)                  # c("a", "f", "k"); hlavní diagonála
diag(C[, dim(C)[2]:1])   # c("d", "g", "j"); vedlejší diagonála

Příklady[upravit | editovat zdroj]

Matematické operace: Maticová algebra[upravit | editovat zdroj]

Kdo chce v R pracovat s maticemi, zřejmě už má nějakou představu o maticové algebře. Nějaké informace na toto téma jsou např. ZDE.

Tady si uvedeme jen, jak některé prvky maticové algebry zapíšeme v R.

  • Hadamardův součin matic A a B: A * B
  • Maticový součin matic A a B: A %*% B
  • Transpozice matice A (AT): t(A)
  • Jednotková matice I2: diag(2
  • Inverzní matice A-1: solve(A)
  • Vlastní čísla matice A: eigen(A)$values
  • Vlastní vektory matice A: eigen(A)$vectors # R vrací ortonormální vlastní vektory