Mátrix funkció az R-ben: létrehozás, nyomtatás, oszlop hozzáadása és szeletelés
⚡ Okos összefoglaló
Az R-ben a mátrix egy kétdimenziós tömb, amely egyetlen adattípust tartalmaz m sorban és n oszlopban, a matrix() függvénnyel hozható létre, a cbind() és rbind() függvénnyel bővíthető, és szögletes zárójelen keresztül érhető el.

Mátrix függvény az R-ben
Az R mátrixfüggvénye egy kétdimenziós tömb, amelynek m számú sora és n számú oszlopa van. Más szavakkal, a mátrix az R programozásban két vagy több, azonos adattípusú vektor kombinációja.
A mátrix alatt egy vektor értendő, amely egy két hosszúságú dim attribútumot tartalmaz. Ezért minden elemnek egy típust kell osztania: abban a pillanatban, amikor egy karakteres érték csatlakozik a számokhoz, az egész mátrix karakteressé válik. Az R egyetlen oszloponkénti sorozatban tárolja az értékeket, és a dim függvény segítségével dönti el, hogy hol végződnek az egyes sorok, így a következők megválasztása... adattípus egyszerre vonatkozik az egész objektumra.
Jegyzet: Maga a matrix() mindig pontosan két dimenziót ad vissza. Három vagy több dimenziós struktúra létrehozásához az R-ben használd az array() függvényt egy dim vektorral, vagy rendeld hozzá közvetlenül a dim() függvényt. Az alábbi ábra a sor- és oszlopelrendezést mutatja, amelyet minden mátrix követ.
Hogyan készítsünk mátrixot R-ben
Létrehozhatunk egy mátrixot a következő függvénnyel: mátrix()Az alap R szignatúra öt argumentumot fogad el, és a leggyakrabban használt hármat itt mutatjuk be:
matrix(data, nrow, ncol, byrow = FALSE)
érvek:
- Az információk szétdarabolódásaAzon elemek gyűjteménye, amelyeket R a mátrix soraiba és oszlopaiba rendez.
- nrowSorok száma.
- ncolOszlopok száma.
- byrow: Logikai jelző. Az alapértelmezett byrow = FALSE értékkel a mátrix oszlopról oszlopra, fentről lefelé töltődik. Ha byrow = TRUE, akkor sorról sorra, balról jobbra töltődik.
- halványnevek: Egy két hosszúságú opcionális lista, amely a sorok és az oszlopok nevét tartalmazza.
Az első példa előtt érdemes megismerni az alap R hivatkozás két részletét. Ha az nrow és ncol közül csak az egyiket adjuk meg, az R a másikat az adat hosszából következteti ki. Ha pedig az adat túl kevés elemet tartalmaz a kért alakzat kitöltéséhez, az értékeket újrahasznosítja ahelyett, hogy elutasítaná.
Szerkesszünk két 5×2-es mátrixot 1-től 10-ig terjedő számsorozatból, az egyikben a byrow = TRUE, a másikban a byrow = FALSE, hogy lássuk a különbséget.
# 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
output:
Mivel a byrow = TRUE beállítást használtuk, a konzol az első sort 1-gyel és 2-vel, a második sort 3-mal és 4-gyel, és így tovább tölti ki.
Írd ki az a mátrix dimenzióját a dim() függvénnyel
Most nyomtassuk ki a mátrix dimenzióját R-ben a dim()-lel. Az R-ben a dim() használatával kinyomtatott mátrix szintaxisa a következő:
# Print dimension of the matrix with dim()
dim(matrix_a)
output:
## [1] 5 2
A dim() függvény először a sorok számát, másodszor pedig az oszlopok számát adja vissza, megerősítve az 5×2-es alakzatot.
Mátrix kitöltése oszloponként byrow = FALSE értékkel
Ugyanaz a tíz szám és ugyanaz az nsor más elrendezést eredményez, ha a kitöltési irány megváltozik. Tartsa megping A byrow alapértelmezés szerint az első oszlopban lévő értékeket küldi lejjebb, mielőtt a második elkezdődne.
# 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
output:
Nyomtassa ki a matrix_b dimenzióját a dim() függvénnyel
Ismét nyomtassa ki a mátrix méretét a dim() segítségével. Az alábbiakban az R nyomtatási mátrix dimenzió szintaxisa látható:
# Print dimension of the matrix with dim()
dim(matrix_b)
output:
## [1] 5 2
Az alakzat változatlan 5×2-nél, mivel a byrow a kitöltési sorrendet változtatja meg, a méreteket soha.
MegjegyzésekA matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) parancs használata ugyanazt az eredményt hozza, mint a fenti, mivel az R a megadott tíz értékből az nrow = 5 értéket következteti ki.
Létrehozhatsz egy 4×3-as mátrixot az ncol használatával is. Az R 3 oszlopot hoz létre, és mindegyiket felülről lefelé tölti ki. Nézzünk meg egy példát
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
output:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Az oszlopfejlécek [,1] - [,3] és a sorcímkék [1,] - [4,] az R alapértelmezett helyőrzői. Amint a valós dimname-eket megadjuk, eltűnnek, ahogy az a bemutató későbbi részében látható.
Példa:
dim(matrix_c)
output:
## [1] 4 3
Adjon hozzá egy oszlopot egy mátrixhoz a cbind()
Az R mátrixhoz a cbind() paranccsal adhatsz hozzá oszlopot. A cbind() oszlopkötést jelent, és annyi mátrixot vagy oszlopot fűzhet össze, amennyit megadtunk. Például az előző példánkban egy 5×2-es mátrixot hoztunk létre. Összefűzünk egy harmadik oszlopot, és ellenőrizzük, hogy a dimenzió 5×3-e.
Példa:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
output:
## [1] 5 3
Példa:
matrix_a1
teljesítmény
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Példa:
Egyszerre több oszlopot is össze tudunk kötni. A következő blokk a matrix_a2-t építi fel, egy 4×3-as mátrixot, amely a 13-tól 24-ig terjedő számokat tartalmazza, így azt össze lehet kapcsolni a 4×3-as matrix_c-vel, így egy 4×6-os eredményt kapunk, amely az 1-től 24-ig terjedő számokat tartalmazza.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
output:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Példa:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
output:
## [1] 4 6
JEGYZETAz R-ben lévő mátrixok sorainak számának egyenlőnek kell lennie ahhoz, hogy a cbind() működjön. Ha ezek eltérnek, az R vagy újrahasznosítja a rövidebb bemenetet, vagy hibát jelez, ezért a dim() első ellenőrzése mindkét objektumon a biztonságosabb megoldás.
Ahol a cbind() oszlopokat fűz össze, az rbind() sorokat fűz hozzá. Adjunk hozzá egy sort a matrix_c mátrixunkhoz, és ellenőrizzük, hogy a dimenzió 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)
output:
## [1] 5 3
Figyeljük meg, hogy egy elnevezett vektor, például az add_row függvény összefűzése az új sornak is megadja ezt a nevet, ami az első lépés a későbbiekben tárgyalt címkézett mátrixok felé.
Szeletelj fel egy mátrixot
Egy mátrixból kiválaszthatunk egy vagy több elemet. R programozás a szögletes zárójelek [ ] használatával. A zárójelekben a sorválasztó szerepel először, az oszlopválasztó pedig csak ezután, vesszővel elválasztva. Itt jön a képbe a szeletelés.
Például:
- A matrix_c[1,2] az első sorban és a második oszlopban lévő elemet választja ki.
- A matrix_c[1:3,2:3] egy R szeletmátrixot eredményez, amelynek adatai az 1., 2., 3. sorban és a 2. és 3. oszlopban találhatók.
- matrix_c[,1] kijelöli az első oszlop összes elemét.
- matrix_c[1,] kijelöli az első sor összes elemét.
Ha a vessző egyik oldalát üresen hagyjuk, az összes azon az oldalon lévő érték is üresen marad. Az egyik következmény meglepheti a kezdőket: amikor egyetlen sort vagy oszlopot választunk ki, az R elveti az üres dimenziót, és egy sima vektort ad vissza. A drop = FALSE hozzáadása, mint például a matrix_c[1, , drop = FALSE] esetén, mátrixként tartja az eredményt.
Itt van a fenti kódok kimenete
Nevezd meg egy mátrix sorait és oszlopait R-ben
Az olyan alapértelmezett címkék, mint az [,1] és [3,], megnehezítik a kimenet olvasását, amint egy mátrix valódi jelentéssel bír. A dimnames argumentum, valamint a rownames() és colnames() helyettesítő függvények szöveges címkéket csatolnak a mátrixhoz, amelyek aztán a cbind(), t() és minden szeletelési műveleten keresztül a mátrixszal együtt haladnak.
# 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']
| Funkció | Olvas | Szettek |
|---|---|---|
| dimnames(m) | Mindkét dimenzió két vektor listájaként | dimnames(m) <- lista(sorok, oszlopok) |
| sornevek(m) | A sorcímkék | sornevek(m) <- sorok |
| oszlopnevek(m) | Az oszlopcímkék | oszlopnevek(m) <- oszlopok |
| halvány(m) | Sorok és oszlopok két egész számként | dim(m) <- c(nrow, ncol) |
Miután a címkék léteznek, a sales['north', 'q2'] sokkal egyértelműbb, mint a sales[1, 2], és túléli a sorok átrendezését. A dimnames komponens NULL értékre állítása eltávolítja a címkék halmazát, és az as.data.frame() függvénnyel konvertált mátrix a sor- és oszlopneveket egyenesen a következőbe viszi: adatkeret.
Mátrix OperaR-ben: Számtan, transzponálás és szorzás
A mátrixokon végzett aritmetikai műveleteknél kifizetődő az egytípusú szabály. Az R bázis a teljes halmazt kezeli extra csomag nélkül, de két operátort könnyű összetéveszteni: a * elemenként szorozza az elemeket, míg a %*% valódi mátrixszorzást végez, és megköveteli, hogy a bal oldali operandus oszlopai megegyezzenek a jobb oldali operandus soraival.
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): Transzponálja a mátrixot, így az [i, j] elem [j, i] lesz. A dimenziónevek átkerülnek.
- megold(m): Egy négyzetes, nem szinguláris mátrix inverzét adja vissza, és a solve(a, b) egy lineáris egyenletrendszert old meg.
- sorÖsszegek / oszlopÖsszegek / sorÁtlagok / oszlopÁtlagokDokumentáció szerint egyenértékű az apply() függvénnyel sum vagy mean esetén, de sokkal gyorsabb.
- alkalmaz(m, MARGIN, FUN)A MARGIN = 1 a sorokat, a MARGIN = 2 pedig az oszlopokat járja be, bármely megadott függvény esetében.
- diag, det, keresztbe tett kísérlet: Átló, determináns és a t(x) %*% y gyorsabb alakja.
Mivel ezek a műveletek vektorizáltak, ciklusokat helyettesítenek, ahelyett, hogy azokba lennének beépítve. Egy olyan összegzés, amely egy beágyazott for ciklust venne igénybe több ezer cellán keresztül, egyetlen colMeans() hívássá válik, ami az adatmennyiség növekedésével azonnal számít.
Mátrix vs. adatkeret vs. tömb R-ben
A mátrixok, adatkeretek és tömbök mind téglalap alakúnak tűnnek a konzolban, mégis különböző kérdésekre adnak választ. A táblázat egymás mellé sorolja őket.
| Ingatlanok | Mátrix | Adatkeret | Sor |
|---|---|---|---|
| Méretek | Pontosan 2 | Pontosan 2 | Bármilyen szám |
| Oszloptípusok | Egy típus az egész objektumhoz | Oszloponként eltérő típus | Egy típus az egész objektumhoz |
| Beépített | mátrix() | adat.frame() | tömb () |
| Tipikus felhasználás | Numerikus számítás és lineáris algebra | Vegyes megfigyelési adatok | Halmozott táblázatok, például évenkénti darabszámok |
| Sorcímkék | Opcionális dimennevek | A sorok nevei mindig jelen vannak | Opcionális dimennevek |
# 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')
Nyúlj egy mátrixhoz, ha minden cella ugyanolyan típusú szám, és a munka aritmetikai. Nyúlj egyhez adatkeret amikor az oszlopok különböző típusokat tartalmaznak, például egy karakteres név egy numerikus ár mellett és egy tényezőNyúlj egyért lista amikor az alkatrészek különböző hosszúságúak, és egy tömb esetében, amikor valóban létezik egy harmadik index, például az idő vagy a régió. Az as.matrix() és az as.data.frame() segítségével mindkét irányú konverzió olcsó, így a struktúra követheti a feladatot, ahelyett, hogy fordítva tenné.




