User Tools

Site Tools


Sidebar

Vít Syrovátka

Úvod do R


Teorie

Sekce Teorie je (a asi ještě dlouho bude) v průběžné výstavbě.

Software

Objekty v R

Cvičení

Data

Zápočet

Další zdroje

R for Data Science (2017) - excelentní tutorial Hadleyho Wickhama následující filozofii tidyversu
Data Processing with dplyr & tidyr - tutorial na úpravu dataframů pomocí tidyversových balíků dplyr a tidyr

r_intro:cs:theory:matrices

Matice

Matice jsou jen rozšířením vektorů - jsou to vektory poskládané do řádků a sloupců. Vektory s přiřazeným atributem dim - dimensions. Stejně jako vektory mohou obsahovat jen hodnoty stejného typu.

Rozměry matice

Základním atributem matice jsou její dva rozměry (dimensions) dim() :

  1. počet řádků nrow()
  2. a počet sloupců ncol() .

V tomto pořadí jsou vždy zadávány, případně vráceny.

Přiřazením rozměrů vektoru můžeme matici vytvořit:

vec<- c(1,5,4,4,0,7)
dim(vec)<- c(3,2)
vec
     [,1] [,2]
[1,]    1    4
[2,]    5    0
[3,]    4    7

Obvykle ale funkce dim(), nrow() a ncol() používáme pro zjištění rozměrů již existujících matic či maticových objektů obecně (např. datový rámec, pole).

nrow(vec)
[1] 3
ncol(vec)
[1] 2
dim(vec)
[1] 3 2

Rozměry matici můžeme též odebrat:

dim(vec)<- NULL
vec
[1] 1 5 4 4 0 7
# stejného bychom dosáhli i převedením na vektor:
vec<- as.vector(vec)

Všiměte si, že hodnoty se do matice skládají po sloupcích a po sloupcích se také rozloží do vektoru. To můžeme změnit, použijeme-li funkci pro tvorbu matic stvořenou, funkci matrix().

Vytvoření matice funkcí matrix()

Použití funkce matrix()

Funkce matrix() je designovaná pro tvorbu a úpravu matic. Ve funkci matrix() specifikujeme:

  1. data data= , která chceme skládat
  2. do kolika řádků nrow= ,
  3. případně do kolika sloupců ncol= ,
  4. zda chceme, aby hodnoty byly skládány po řádcích byrow= FALSE
  5. a nakonec můžeme specifikovat i jména řádků a sloupců dimnames= .

Funkce matrix() skládané hodnoty automaticky replikuje na požadovaný rozměr matice a také si sama dokáže dopočítat druhý rozměr matice, odpovídající množství přeskládávaných dat.

Matici o třech řádcích z vektoru vec tedy vytvoříme například takto:

matrix(vec, nrow= 3)
     [,1] [,2]
[1,]    1    4
[2,]    5    0
[3,]    4    7

Nebo můžeme místo počtu řádků specifikovat počet sloupců, nebo i obojí:

matrix(vec, ncol= 2)
     [,1] [,2]
[1,]    1    4
[2,]    5    0
[3,]    4    7
 
matrix(vec, nrow= 3, ncol= 2)
     [,1] [,2]
[1,]    1    4
[2,]    5    0
[3,]    4    7

Zde je na místě varování. Čím víc toho sami počítáme a píšeme, tím pravděpodobněji někde uděláme chybu. Pokud bychom se spletli při zadávání rozměrů matice, R nás nebude varovat, pokud počet hodnot ve výsledné matici bude násobkem počtu hodnot, které chceme do matice naskládat.1) Malá chyba pak může vést k vytvoření úplně jiné matice.

matrix(vec, nrow=4, ncol=3, byrow=T)
     [,1] [,2] [,3]
[1,]    1    5    4
[2,]    4    0    7
[3,]    1    5    4
[4,]    4    0    7

Proto, pokud nemáme v úmyslu skládané hodnoty replikovat, doporučuji při tvorbě matic zadávat pouze jeden rozměr výsledné matice.

Na druhou stranu automatické replikace můžeme využít např. při tvorbě prázdných matic:

matrix(NA, nrow= 3, ncol= 4)
     [,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA

Skládání hodnot po řádcích

Skládání hodnot po řádcích dosáhneme ve funkci matrix() nastavením argumentu byrow= na TRUE . Řikáme “ano, chceme skládat po řádcích - by row”.

matrix(vec, nrow= 3, byrow= T)
     [,1] [,2]
[1,]    1    5
[2,]    4    4
[3,]    0    7

Pojmenování rozměrů matice ve funkci matrix()

Přímo při tvorbě matice funkcí matrix() můžeme nadefinovat jména řádků a sloupců pomocí argumentu dimnames = . Argumentu dimnames = musíme ale poskytnout najednou jak jména řádků, tak jména sloupců a to v tomto pořadí. A abychom to mohli udělat najednou, musíme je zabalit do listu.

matrix(vec, nrow= 3, 
       dimnames= list(c("Anicka","Pepicek","Mispulin"), 
                      c("holek","kluku")))
         holek kluku
Anicka       1     4
Pepicek      5     0
Mispulin     4     7

Pojmenovat můžeme i jen jeden rozměr matice, potom jména druhého rozměru ponecháme NULL. Matici s anonymními osobami vytvoříme takto:

matrix(vec, nrow= 3, 
       dimnames= list(NULL, 
                      c("holek","kluku")))
     holek kluku
[1,]     1     4
[2,]     5     0
[3,]     4     7

Pojmenování rozměrů již existující matice

Rozměry můžeme pojmenovat nebo přejmenovat samozřejmě i u již existujících matic. Slouží k tomu v zásadě 3 funkce, jejichž jména jsou dostatečně samovysvětlující:

  1. rownames() ,
  2. colnames() ,
  3. dimnames() .

Tyto funkce nám vrátí stávající jména daných rozměrů, zároveň do nich můžeme vložit hodnoty, které chceme použít jako jména daných rozměrů. Jména řádků a sloupců uvádíme ve formě textového vektoru, jména obou najednou pak ve formě listu, obsahujícího oba zmíněné vektory. Například:

mat<- matrix(vec, nrow= 3)
mat
     [,1] [,2]
[1,]    1    4
[2,]    5    0
[3,]    4    7
 
# pojmenování řádků:
rownames(mat)<- c("Anicka","Pepicek","Mispulin")
mat
         [,1] [,2]
Anicka      1    4
Pepicek     5    0
Mispulin    4    7
 
# pojmenování sloupců:
colnames(mat)<- c("holek","kluku")
mat
         holek kluku
Anicka       1     4
Pepicek      5     0
Mispulin     4     7
 
# přejmenování řádků i sloupců:
dimnames(mat)<- list(c("Anna", "Josef", "Mispul"), c("female","male"))
mat
       female male
Anna        1    4
Josef       5    0
Mispul      4    7

Vytvoření matice spojením sloupců či řádků

Matici můžeme vytvořit také spojením vektorů po sloupcích, nebo po řádcích. K tomu slouží funkce cbind() (podle column bind)a rbind() (row bind).

cbind(letters[1:5],
      LETTERS[1:5])
     [,1] [,2]
[1,] "a"  "A" 
[2,] "b"  "B" 
[3,] "c"  "C" 
[4,] "d"  "D" 
[5,] "e"  "E" 
 
rbind(letters[1:5],
      LETTERS[1:5])
     [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "b"  "c"  "d"  "e" 
[2,] "A"  "B"  "C"  "D"  "E" 

Takto můžeme vzájemně spojovat i matice, či vektory s maticemi, jen spolu musí být kompatibilní v rozměru, přes který dochází ke spojení. K matici o 5 řádcích tedy do dalšího sloupečku můžu přidat jen vektor s 5 elementy, či matici opět s 5 řádky.

x <- matrix(1:6, ncol = 3)
x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
 
cbind(x, 7:8)
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
 
rbind(x, c(3, 5, 7))
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    3    5    7
1)
Stejně jako při jakékoliv jiné automatické replikaci.
r_intro/cs/theory/matrices.txt · Last modified: 2018/10/10 16:02 by vitek