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.

  • 🧩 Struktura: Matice je vektor s atributem dim, takže každá buňka musí sdílet jeden datový typ.
  • 🛠️ Stvoření: matrix(data, nrow, ncol, byrow) uspořádá posloupnost a R odvodí chybějící dimenzi.
  • 🔄 Pořadí vyplnění: Hodnota byrow = FALSE vyplňuje sloupec po sloupci, zatímco hodnota byrow = TRUE vyplňuje řádek po řádku.
  • Růst: cbind() přidává sloupce a rbind() přidává řádky, pokud se sdílená dimenze shoduje.
  • Krájení: Funkce m[řádek, sloupec] nejprve přečte řádky a prázdná strana vybere vše na této straně.
  • ???? ️ Štítky: Funkce dimnames, rownames() a colnames() nahrazují zástupné symboly [,1] čitelnými názvy.
  • ➕➖ Aritmetický: Hvězdička násobí prvek po prvku, zatímco %*% provádí násobení matic.

Maticová funkce v R Vytvořit Tisk Přidat sloupec a řez

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.

Rozložení maticové funkce v R v řádcích a sloupcích

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.

Výstup konzole matice_a vyplněný řádek po řádku s byrow = TRUE

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:

Výstup konzole matice_b je vyplněn sloupec po sloupci s byrow = FALSE

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

Výsledky konzole pro čtyři výrazy pro rozdělení matice v R

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.

Nejčastější dotazy

R hodnoty recykluje, místo aby je odmítal, takže matrix(1:3, nrow = 2, ncol = 3) opakuje sekvenci. Varování se zobrazí pouze tehdy, když délka není přesným násobkem počtu buněk, což činí tichou recyklaci snadno přehlédnutelnou chybou.

Použijte záporný index: m[-2, ] odstraní druhý řádek a m[, -3] odstraní třetí sloupec. Několik objektů může být použito najednou s m[-c(1, 4), ]. Původní objekt zůstává nezměněn, dokud nepřiřadíte výsledek zpět.

Výběr jednoho řádku nebo sloupce ve výchozím nastavení odstraní prázdný rozměr. Přidejte drop = FALSE, jako v m[1, , drop = FALSE], chcete-li zachovat matici s jedním řádkem. To je důležité, když je výsledek předáván funkci, která očekává dva rozměry.

Funkce which(m == hodnota, arr.ind = TRUE) vrací dvousloupcový výsledek udávající řádek a sloupec všech shod. Bez funkce arr.ind je odpovědí jeden lineární index odpočítávaný po sloupcích, což je zřídka to, co chcete.

Použijte array(data, dim = c(rows, columns, layers)) nebo přiřaďte dim(x) přímo vektoru. Dělení pak bere jeden index na dimenzi, například a[2, 3, 1]. Matice je jednoduše dvourozměrný případ pole.

Ano. V referenčním dokumentu R se uvádí, že rowSums a colMeans jsou ekvivalentní apply() se sum nebo mean, ale mnohem rychlejší a obě jsou lepší než explicitní smyčka for, protože iterace probíhá v kompilovaném kódu, nikoli v interpretu.

Fitování modelu je lineární algebra: rysy tvoří matici, koeficienty tvoří vektor a predikce je jediný součin %*%. Mnoho strojové učení Balíčky proto vyžadují jako vstup číselnou matici, nikoli datový rámec.

Ano. GitHub Copilot běží v RStudio 2023.09.0 a novějších verzích a doplňuje kód z komentářů v otevřeném souboru. Zkontrolujte jeho logiku kótování v RStudio, protože i špatný řádek stále vytváří platnou matici.

Shrňte tento příspěvek takto: