Funkce matice v R: Vytvořit, vytisknout, přidat sloupec a řez
⚡ Chytré shrnutí
Matice v R je dvourozměrné pole, které obsahuje jeden datový typ v m řádcích a n sloupcích, sestavené pomocí matrix(), rozšířené pomocí cbind() a rbind() a dostupné pomocí hranatých závorek.
Maticová funkce v R
Maticová funkce v R je 2-rozměrné pole, které má m počet řádků a n počet sloupců. Jinými slovy, matice v programování R je kombinací dvou nebo více vektorů se stejným datovým typem.
Matice je v dalším textu jednoduše vektor s atributem dim o délce dva. Proto musí každý prvek sdílet jeden typ: v okamžiku, kdy se znaková hodnota spojí s čísly, je celá matice převedena na znakový typ. R ukládá hodnoty v jednom sloupcovém běhu a pomocí dim určuje, kde každý řádek končí, takže volba datový typ platí pro celý objekt najednou.
Poznámka: Samotná funkce matrix() vždy vrací přesně dva rozměry. Chcete-li v R vytvořit strukturu se třemi nebo více rozměry, použijte array() s vektorem dim nebo přiřaďte dim() přímo. Následující diagram ukazuje rozložení řádků a sloupců, které každá matice dodržuje.
Jak vytvořit matici v R
Můžeme vytvořit matici s funkcí matice()Základní signatura R přijímá pět argumentů a tři nejčastěji používané jsou uvedeny zde:
matrix(data, nrow, ncol, byrow = FALSE)
argumenty:
- datumSoubor prvků, které R uspořádá do řádků a sloupců matice.
- nrowPočet řádků.
- ncolPočet sloupců.
- byrowLogický příznak. Při výchozí hodnotě byrow = FALSE se matice plní sloupec po sloupci, shora dolů. Při byrow = TRUE se plní řádek po řádku, zleva doprava.
- názvy rozměrůVolitelný seznam o délce dva, který obsahuje názvy řádků a názvy sloupců.
Před prvním příkladem je dobré znát dva detaily ze základní reference R. Pokud je zadán pouze jeden z parametrů nrow a ncol, R odvodí druhý z délky dat. A pokud data obsahují příliš málo prvků pro vyplnění požadovaného tvaru, hodnoty se recyklují, nikoli odmítají.
Sestrojme z posloupnosti čísel 1 až 10 dvě matice 5×2, jednu s byrow = TRUE a druhou s byrow = FALSE, abychom viděli rozdíl.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = TRUE matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5) matrix_a
Výstup:
Protože byl použit byrow = TRUE, konzole vyplní první řádek čísly 1 a 2, druhý řádek čísly 3 a 4 atd.
Vypište dimenzi matice_a pomocí dim()
Nyní vytiskneme rozměr matice v R pomocí dim(). Syntaxe pro tisk matice v R pomocí dim() je:
# Print dimension of the matrix with dim()
dim(matrix_a)
Výstup:
## [1] 5 2
dim() vrací nejdříve počet řádků a poté počet sloupců, čímž potvrzuje tvar 5×2.
Naplnění matice po sloupcích s byrow = FALSE
Stejných deset čísel a stejný řádek vytvoří jiné uspořádání, jakmile se změní směr plnění. Keeping Funkce byrow ve výchozím nastavení odesílá hodnoty z prvního sloupce před zahájením druhého.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = FALSE matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5) matrix_b
Výstup:
Vypište dimenzi matice_b pomocí dim()
Opět vytiskněte rozměr matice pomocí dim(). Níže je uvedena syntaxe rozměru tiskové matice R:
# Print dimension of the matrix with dim()
dim(matrix_b)
Výstup:
## [1] 5 2
Tvar se při rozměru 5×2 nezmění, protože byrow mění pořadí plnění a nikdy ne rozměry.
HodnoceníPoužití příkazu matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) bude mít stejný efekt jako výše, protože R odvodí nrow = 5 z deseti zadaných hodnot.
Matici 4×3 můžete také vytvořit pomocí ncol. R vytvoří 3 sloupce a každý sloupec vyplní odshora dolů. Podívejte se na příklad.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Výstup:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Záhlaví sloupců [,1] až [,3] a popisky řádků [1,] až [4,] jsou výchozí zástupné symboly v R. Zmizí, jakmile jsou zadány skutečné názvy dimenzí, jak je ukázáno dále v tomto tutoriálu.
Příklad:
dim(matrix_c)
Výstup:
## [1] 4 3
Přidejte sloupec do matice pomocí cbind()
Sloupec do matice R můžete přidat pomocí příkazu cbind(). cbind() znamená vazbu sloupců a může zřetězit libovolný počet matic nebo sloupců. Například náš předchozí příklad vytvořil matici 5×2. Zřetězíme třetí sloupec a ověříme, že rozměr je 5×3.
Příklad:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Výstup:
## [1] 5 3
Příklad:
matrix_a1
Výstup
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Příklad:
Můžeme také svázat více než jeden sloupec najednou. Další blok vytvoří matici_a2, matici 4×3 obsahující čísla 13 až 24, aby ji bylo možné spojit s maticí_c 4×3 a vytvořit tak výsledek 4×6 pokrývající čísla 1 až 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Výstup:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Příklad:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Výstup:
## [1] 4 6
POZNÁMKAPočet řádků matic v R musí být stejný, aby funkce cbind() fungovala. Pokud se liší, R buď recykluje kratší vstup, nebo vyvolá chybu, takže bezpečnější je nejprve zkontrolovat oba objekty funkcí dim().
Zatímco cbind() zřetězuje sloupce, rbind() přidává řádky. Přidejme jeden řádek k naší matici matrix_c a ověřme, že dimenze je 5×3.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3) # Create a vector of 3 columns add_row <- c(1:3) # Append to the matrix matrix_c <- rbind(matrix_c, add_row) # Check the dimension dim(matrix_c)
Výstup:
## [1] 5 3
Všimněte si, že navázání pojmenovaného vektoru, například add_row, také dává novému řádku tento název, což je první krok k označeným maticím, které jsou popsány dále.
Rozkrojte Matrix
Z matice můžeme vybrat jeden nebo více prvků. Programování R. pomocí hranatých závorek [ ]. Uvnitř závorek je na prvním místě selektor řádku a na druhém selektor sloupce, oddělené čárkou. Zde přichází na řadu krájení.
Například:
- matrix_c[1,2] vybere prvek na prvním řádku a druhém sloupci.
- Funkce matrix_c[1:3,2:3] vytvoří řeznou matici R s daty na řádcích 1, 2, 3 a sloupcích 2 a 3.
- matrix_c[,1] vybere všechny prvky prvního sloupce.
- matrix_c[1,] vybere všechny prvky prvního řádku.
Ponechání jedné strany čárky prázdné tedy znamená všechny hodnoty na této straně. Jeden důsledek zaskočí začátečníky: když je vybrán jeden řádek nebo sloupec, R odstraní prázdnou dimenzi a vrátí zpět prostý vektor. Přidáním drop = FALSE, jako v matrix_c[1, , drop = FALSE], se výsledkem zachová matice.
Zde je výstup, který získáte pro výše uvedené kódy
Pojmenujte řádky a sloupce matice v R
Výchozí popisky jako [,1] a [3,] ztěžují čtení výstupu, jakmile matice nese skutečný význam. Argument dimnames a náhradní funkce rownames() a colnames() připojují textové popisky, které pak putují s maticí přes cbind(), t() a každou operaci dělení.
# Name the rows and columns while the matrix is built sales <- matrix(1:6, nrow = 2, ncol = 3, dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3'))) # Or attach the names afterwards rownames(sales) <- c('north', 'south') colnames(sales) <- c('q1', 'q2', 'q3') # Read the names back as a list of two character vectors dimnames(sales) # Names make label based slicing possible sales['north', 'q2']
| funkce | Čte | soupravy |
|---|---|---|
| názvy rozměrů(m) | Oba rozměry jako seznam dvou vektorů | dimnames(m) <- seznam(řádky, sloupce) |
| názvy_řádků(m) | Popisky řádků | názvy_řádků(m) <- řádky |
| názvy kolumn (m) | Popisky sloupců | názvy_sloupců(m) <- sloupce |
| rozměr(m) | Řádky a sloupce jako dvě celá čísla | dim(m) <- c(řádek, sloupec) |
Jakmile existují popisky, sales['north', 'q2'] je mnohem přehlednější než sales[1, 2] a přežije i změnu pořadí řádků. Nastavením komponenty dimnames na hodnotu NULL se tato sada popisků opět odstraní a matice převedená pomocí as.data.frame() přenese názvy řádků a sloupců přímo do datový rámec.
Matice OperaFunkce v R: Aritmetika, transpozice a násobení
Aritmetika matic je oblastí, kde se pravidlo jednoho typu vyplácí. Základ R zpracovává celou množinu bez dalšího balíčku, ale dva operátory se snadno zaměňují: * násobí prvek po prvku, zatímco %*% provádí skutečné násobení matic a vyžaduje, aby sloupce levého operandu odpovídaly řádkům pravého.
m1 <- matrix(1:4, nrow = 2) m2 <- matrix(5:8, nrow = 2) m1 + m2 # element by element addition m1 * m2 # element by element product, NOT matrix multiplication m1 %*% m2 # true matrix multiplication t(m1) # transpose: rows become columns solve(m1) # inverse, for a square matrix that is not singular rowSums(m1) # one total per row colMeans(m1) # one mean per column apply(m1, 1, max) # any function, applied row by row
- t(m)Transponuje matici, takže prvek [i, j] se stane [j, i]. Názvy dimenzí se přenášejí napříč.
- vyřešit(m)Vrátí inverzi čtvercové, nesingulární matice a funkce solve(a, b) řeší lineární systém.
- Součty_řádků / Součty_sloupců / Průměry_řádků / Průměry_sloupcůDokumentováno jako ekvivalent apply() se sum nebo mean, ale mnohem rychlejší.
- aplikovat(m, MARGIN, ZÁBAVA)MARGIN = 1 prochází řádky a MARGIN = 2 prochází sloupce pro jakoukoli zadanou funkci.
- diagnostika, detekce, křížová produkceDiagonální, determinantní a rychlejší forma funkce t(x) %*% y.
Protože jsou tyto operace vektorizované, nahrazují smyčky, místo aby se nacházely uvnitř nich. Souhrn, který by vyžadoval vnořenou smyčku for přes tisíce buněk, se stává jediným voláním colMeans(), což je důležité, jakmile data narostou.
Matice vs. datový rámec vs. pole v R
Matice, datové rámce a pole vypadají v konzoli jako obdélníkové, přesto odpovídají na různé otázky. Tabulka je seřadí vedle sebe.
| Vlastnictví | Matice | Datový rámec | Řada |
|---|---|---|---|
| Rozměry | Přesně 2 | Přesně 2 | Jakékoliv číslo |
| Typy sloupců | Jeden typ pro celý objekt | Jiný typ na sloupec | Jeden typ pro celý objekt |
| Postaveno | matice() | data.frame() | pole() |
| Typické použití | Numerické výpočty a lineární algebra | Smíšená pozorovací data | Skládané tabulky, například počty podle roku |
| Popisky řádků | Volitelné názvy dimenzí | Názvy řádků jsou vždy přítomny | Volitelné názvy dimenzí |
# A matrix holds one type only, so mixing coerces everything to character mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2) class(mixed[1, 1]) # Convert between the structures as.data.frame(matrix_c) as.matrix(mtcars) # A matrix is the two dimensional case of an array is.matrix(matrix_c) inherits(matrix_c, 'array')
Sáhněte po matici, kde každá buňka je stejného druhu čísla a práce je aritmetická. Sáhněte po datový rámec když sloupce obsahují různé typy, například název znaku vedle číselné ceny a faktorSáhněte po lest když části mají různou délku a pro pole, když skutečně existuje třetí index, například čas nebo oblast. Konverze v obou směrech je pomocí as.matrix() a as.data.frame() levná, takže struktura může sledovat úkol, nikoli naopak.





