Matriisifunktio R:ssä: Luo, tulosta, lisää sarake ja leikkaa

⚡ Älykäs yhteenveto

R:n matriisi on kaksiulotteinen taulukko, joka sisältää yhden tietotyypin m rivillä ja n sarakkeella. Se rakennetaan matrix():lla, laajennetaan cbind():lla ja rbind():lla ja siihen päästään hakasulkeiden kautta.

  • 🧩 Rakenne: Matriisi on vektori, jolla on dim-attribuutti, joten jokaisella solulla on oltava yksi tietotyyppi.
  • 🛠️ Creation: matrix(data, nrow, ncol, byrow) järjestää jonon, ja R päättelee puuttuvan ulottuvuuden.
  • 🔄 Täytä tilaus: byrow = FALSE täyttää sarake sarakkeelta, kun taas byrow = TRUE täyttää rivi riviltä.
  • Kasvu: cbind() liittää sarakkeet ja rbind() rivit, edellyttäen että jaettu ulottuvuus täsmää.
  • Viipalointi: m[rivi, sarake] lukee ensin rivit, ja tyhjä puoli valitsee kaiken sillä puolella olevan.
  • 🏷️ Labels: dimnames, rownames() ja colnames() korvaavat [,1]-paikkamerkit luettavilla nimillä.
  • ➕➖ Aritmeettinen: Tähti kertoo alkion alkiolla, kun taas %*% suorittaa matriisien kertolaskun.

Matriisifunktio R:ssä Luo tulostus, lisää sarake ja osio

Matriisifunktio R:ssä

R:n matriisifunktio on 2-ulotteinen taulukko, jossa on m määrä rivejä ja n sarakkeita. Toisin sanoen R-ohjelmoinnin matriisi on yhdistelmä kahdesta tai useammasta vektorista, joilla on sama tietotyyppi.

Matriisi on yksinkertaisesti vektori, jolla on kahden pituinen dim-attribuutti. Siksi jokaisen elementin on oltava yhtä tyyppiä: heti kun merkkiarvo liittyy lukuihin, koko matriisi pakotetaan merkkimuotoon. R tallentaa arvot yhteen sarakkeeseen ja käyttää dim-attribuuttia päättääkseen, mihin kukin rivi päättyy, joten valinta tietotyyppi koskee koko kohdetta kerralla.

Huomautus: matrix() itse palauttaa aina täsmälleen kaksi ulottuvuutta. Jos haluat rakentaa R:ssä kolmi- tai useampiulotteisen rakenteen, käytä array()-funktiota dim-vektorin kanssa tai määritä dim()-funktiolle suoraan. Alla oleva kaavio näyttää rivi- ja sarakeasettelun, jota jokainen matriisi noudattaa.

Matriisifunktion rivien ja sarakkeiden asettelu R:ssä

Kuinka luoda matriisi R:ssä

Voimme luoda matriisin funktiolla matriisi()R-perusallekirjoitus ottaa vastaan ​​viisi argumenttia, joista kolme useimmin käytettyä on esitetty tässä:

matrix(data, nrow, ncol, byrow = FALSE)

argumentit:

  • tiedotJoukko elementtejä, jotka R järjestää matriisin riveille ja sarakkeisiin.
  • nrowRivien lukumäärä.
  • ncolSarakkeiden lukumäärä.
  • byrowLooginen merkintä. Oletusarvolla byrow = FALSE matriisi täytetään sarake sarakkeelta ylhäältä alas. Jos byrow = TRUE, matriisi täytetään rivi riviltä vasemmalta oikealle.
  • dimnamesValinnainen kahden pituinen lista, joka sisältää rivien ja sarakkeiden nimet.

Kaksi yksityiskohtaa R-perusviittauksesta on hyvä tietää ennen ensimmäistä esimerkkiä. Jos annetaan vain toinen nrow:sta ja ncol:sta, R päättelee toisen datan pituudesta. Ja jos datassa on liian vähän elementtejä pyydetyn muodon täyttämiseksi, arvot kierrätetään hylkäämisen sijaan.

Muodostetaan kaksi 5×2-matriisia numerosarjasta 1–10, toinen, jossa byrow = TOSI ja toinen, jossa byrow = EPÄTOSI, nähdäksemme eron.

# 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

lähtö:

Koska käytettiin arvoa byrow = TRUE, konsoli täyttää ensimmäisen rivin numeroilla 1 ja 2, toisen rivin numeroilla 3 ja 4 ja niin edelleen.

Matriisin_a konsolin tuloste täytetään rivi riviltä arvolla byrow = TRUE

Tulostetaan nyt R:n matriisin mitat dim(:llä). Syntaksi tulostaa matriisin R:ssä käyttämällä dim():tä on:

# Print dimension of the matrix with dim()
dim(matrix_a)

lähtö:

## [1] 5 2

dim() palauttaa ensin rivien määrän ja toiseksi sarakkeiden määrän, mikä vahvistaa 5×2-muodon.

Täytä matriisi sarakkeen mukaan rivikohtaisesti arvolla FALSE

Samat kymmenen numeroa ja sama rivi-nro tuottavat erilaisen järjestyksen, kun täyttösuunta muuttuu. Pidäping byrow lähettää oletusarvoisesti ensimmäisen sarakkeen arvot alaspäin ennen toisen sarakkeen alkamista.

# 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

lähtö:

Matriisin matriisi_b konsolin tuloste täytettiin sarake sarakkeelta arvolla byrow = FALSE

Tulosta taas matriisin mitat dim(:llä). Alla on syntaksi R-tulostusmatriisin ulottuvuudesta:

# Print dimension of the matrix with dim()
dim(matrix_b)

lähtö:

## [1] 5 2

Muoto pysyy muuttumattomana koossa 5×2, koska byrow muuttaa täyttöjärjestystä eikä koskaan mittoja.

HuomautuksiaKomennolla matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) on sama vaikutus kuin yllä, koska R päättelee nrow = 5 annetuista kymmenestä arvosta.

Voit myös luoda 4×3-matriisin käyttämällä ncol-funktiota. R luo kolme saraketta ja täyttää jokaisen sarakkeen ylhäältä alas. Katso esimerkkiä.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

lähtö:

##       [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Sarakeotsikot [,1] - [,3] ja riviotsikot [1,] - [4,] ovat R:n oletusarvoisia paikkamerkkejä. Ne katoavat heti, kun todelliset dimname-nimet annetaan, kuten myöhemmin tässä opetusohjelmassa näytetään.

Esimerkiksi:

dim(matrix_c)

lähtö:

## [1] 4 3

Lisää sarake matriisiin komennolla cbind()

Voit lisätä sarakkeen matriisiin R komennolla cbind(). cbind() tarkoittaa sarakesidontaa, ja se voi yhdistää niin monta matriisia tai saraketta kuin on määritetty. Esimerkiksi edellinen esimerkkimme loi 5×2-matriisin. Yhdistämme kolmannen sarakkeen ja varmistamme, että ulottuvuus on 5×3.

Esimerkiksi:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

lähtö:

## [1] 5 3

Esimerkiksi:

matrix_a1

ulostulo

##       [,1] [,2] [,3]
## [1,]    1    2    1
## [2,]    3    4    2
## [3,]    5    6    3
## [4,]    7    8    4
## [5,]    9   10    5

Esimerkiksi:

Voimme myös sitoa useamman kuin yhden sarakkeen kerrallaan. Seuraava lohko muodostaa matrix_a2:n, 4×3-matriisin, joka sisältää luvut 13–24. Se voidaan yhdistää 4×3-matriisiin_c, jolloin saadaan 4×6-tulos, joka kattaa luvut 1–24.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

lähtö:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

Esimerkiksi:

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)		
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)

lähtö:

## [1] 4 6

HUOMAUTUSJotta cbind() toimisi, R:n matriisien rivien lukumäärän on oltava sama. Kun ne eroavat toisistaan, R joko kierrättää lyhyemmän syötteen tai aiheuttaa virheen, joten dim():n tarkistaminen molemmille objekteille ensin on turvallisempi tapa.

Kun cbind() yhdistää sarakkeita, rbind() liittää rivejä. Lisätään yksi rivi matrix_c-matriisiin ja tarkistetaan, että sen dimensio on 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)

lähtö:

## [1] 5 3

Huomaa, että nimetyn vektorin, kuten add_row, sitominen antaa myös uudelle riville kyseisen nimen, mikä on ensimmäinen askel kohti jäljempänä käsiteltyjä merkittyjä matriiseja.

Leikkaa matriisi

Voimme valita matriisista yhden tai useamman elementin R-ohjelmointi käyttämällä hakasulkeita [ ]. Hakasulkeiden sisällä rivivalitsin on ensin ja sarakevalitsin toisena, pilkulla erotettuna. Tässä kohtaa viipalointi tulee kuvaan.

Esimerkiksi:

  • matriisi_c[1,2] valitsee elementin ensimmäisestä rivistä ja toisesta sarakkeesta.
  • matrix_c[1:3,2:3] tuottaa R-siivumatriisin, jonka tiedot ovat riveillä 1, 2 ja 3 sekä sarakkeissa 2 ja 3.
  • matriisi_c[,1] valitsee kaikki ensimmäisen sarakkeen elementit.
  • matriisi_c[1,] valitsee kaikki ensimmäisen rivin elementit.

Pilkun toisen puolen jättäminen tyhjäksi tarkoittaa siis jokaista sillä puolella olevaa arvoa. Yksi seuraus yllättää aloittelijat: kun yksi rivi tai sarake valitaan, R pudottaa tyhjän ulottuvuuden ja palauttaa tavallisen vektorin. Lisäämällä drop = FALSE, kuten matriisi_c[1, , drop = FALSE], tulos pysyy matriisina.

Tässä on tulos, jonka saat yllä oleville koodeille

Neljän matriisin viipalointilausekkeen konsolitulokset R:ssä

Matriisin rivien ja sarakkeiden nimeäminen R:ssä

Oletusarvoiset otsikot, kuten [,1] ja [3,], tekevät tulosteesta vaikeasti luettavan heti, kun matriisilla on todellinen merkitys. dimnames-argumentti ja rownames()- ja colnames()-korvausfunktiot liittävät tekstiotsikot, jotka sitten kulkevat matriisin mukana cbind()- ja t()-funktioiden sekä jokaisen viipalointioperaation läpi.

# 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']
Toiminto lukee Setit
dimnames(m) Molemmat ulottuvuudet kahden vektorin listana dimnames(m) <- list(rivit, sarakkeet)
rivinimet(m) Rivin otsikot rivien nimet(m) <- rivit
sarakenimet(m) Sarakkeiden otsikot sarakkeiden nimet(m) <- sarakkeet
hämärä (m) Rivit ja sarakkeet kahtena kokonaislukuna dim(m) <- c(nrivi, ncol)

Kun otsikot ovat olemassa, sales['north', 'q2'] on paljon selkeämpi kuin sales[1, 2] ja säilyy rivien uudelleenjärjestyksen jälkeen. Dimnames-komponentin asettaminen arvoon NULL poistaa kyseisen otsikkojoukon uudelleen, ja as.data.frame()-funktiolla muunnettu matriisi siirtää rivi- ja sarakenimensä suoraan matriisiin. datakehys.

Matriisi OperaR-kielen funktiot: Aritmetiikka, transponointi ja kertolasku

Matriisien laskennassa yksittäinen tyyppisääntö on paras vaihtoehto. R-kantaluku käsittelee koko joukon ilman erillistä pakettia, mutta kaksi operaattoria on helppo sekoittaa: * kertoo elementin elementillä, kun taas %*% suorittaa aidon matriisikertolaskun ja vaatii, että vasemman operandin sarakkeet vastaavat oikean operandin rivejä.

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): Transponoi matriisin, jolloin alkiosta [i, j] tulee [j, i]. Dimensiot siirtyvät eteenpäin.
  • ratkaista(m)Palauttaa neliömäisen, ei-singulaarisen matriisin käänteismatriisin ja solve(a, b) ratkaisee lineaarisen lukuryhmän.
  • riviSummat / sarakeSummat / riviKeskiarvot / sarakeKeskiarvotDokumentoitu vastaavan funktiota apply() summan tai keskiarvon kanssa, mutta huomattavasti nopeammaksi.
  • käytä(m, MARGIN, HAUSKA)MARGIN = 1 käy läpi rivit ja MARGIN = 2 sarakkeet mille tahansa antamallesi funktiolle.
  • diag, det, ristiintuottoDiagonaali, determinantti ja nopeampi muoto t(x):stä %*% y.

Koska nämä operaatiot ovat vektorisoituja, ne korvaavat silmukoita sen sijaan, että ne olisivat niiden sisällä. Yhteenvedosta, joka veisi sisäkkäisen for-silmukan tuhansien solujen yli, tulee yksi colMeans()-kutsu, millä on merkitystä heti datan kasvaessa.

Matriisi vs. datakehys vs. taulukko R:ssä

Matriisit, datakehykset ja taulukot näyttävät kaikki konsolissa suorakaiteen muotoisilta, mutta ne vastaavat eri kysymyksiin. Taulukossa ne on asetettu vierekkäin.

Omaisuus Matriisi Datakehys Ryhmä
Mitat Aivan 2 Aivan 2 Mikä tahansa numero
Saraketyypit Yksi tyyppi koko objektille Eri tyyppi saraketta kohden Yksi tyyppi koko objektille
Rakennettu matriisi() data.frame() array ()
Tyypillinen käyttö Numeerinen laskenta ja lineaarialgebra Sekalaiset havaintotiedot Pinotut taulukot, kuten määrät vuosittain
Rivin otsikot Valinnaiset dimnames-nimet Rivien nimet ovat aina läsnä Valinnaiset dimnames-nimet
# 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')

Tartu matriisiin, kun jokainen solu on samanlaista lukua ja työ on aritmeettista. Tartu a:han datakehys kun sarakkeissa on eri tyyppejä, esimerkiksi numeron hinnan vieressä oleva merkkinimi ja tekijäKurottele kohti lista kun osilla on eri pituudet, ja taulukon tapauksessa, kun kolmas indeksi, kuten aika tai alue, on todella olemassa. Muuntaminen kumpaankin suuntaan on edullista as.matrix():n ja as.data.frame():n avulla, joten rakenne voi seurata tehtävää eikä toisinpäin.

UKK

R kierrättää arvot hylkäämisen sijaan, joten matrix(1:3, nrow = 2, ncol = 3) toistaa sekvenssin. Varoitus tulee näkyviin vain, jos pituus ei ole solujen lukumäärän tarkka monikerta, mikä tekee hiljaisesta kierrätyksestä helposti huomaamattoman virheen.

Käytä negatiivista indeksiä: m[-2, ] poistaa toisen rivin ja m[, -3] poistaa kolmannen sarakkeen. Useita voi poistaa kerralla käyttämällä m[-c(1, 4), ]. Alkuperäinen objekti pysyy muuttumattomana, kunnes asetat tuloksen takaisin.

Yhden rivin tai sarakkeen valitseminen pudottaa oletusarvoisesti tyhjän ulottuvuuden. Lisää drop = FALSE, kuten m[1, , drop = FALSE], säilyttääksesi yksirivisen matriisin. Tällä on merkitystä, kun tulos välitetään funktiolle, joka odottaa kahta ulottuvuutta.

which(m == value, arr.ind = TRUE) palauttaa kaksisarakkeisen tuloksen, joka antaa jokaisen osuman rivin ja sarakkeen. Ilman arr.ind-funktiota vastaus on yksi lineaarinen indeksi laskettuna sarakkeista alaspäin, mikä on harvoin haluttu tulos.

Käytä funktiota array(data, dim = c(rows, columns, layers)) tai aseta dim(x) suoraan vektorille. Viipalointi ottaa tällöin yhden indeksin ulottuvuutta kohden, kuten a[2, 3, 1]. Matriisi on yksinkertaisesti taulukon kaksiulotteinen esimerkki.

Kyllä. R-perusviittauksessa todetaan, että rowSums ja colMeans ovat yhtäpitäviä apply()-funktion kanssa summan tai keskiarvon kanssa, mutta paljon nopeampia, ja molemmat voittavat eksplisiittisen for-silmukan, koska iterointi tapahtuu käännetyssä koodissa eikä tulkissa.

Mallin sovitus on lineaarialgebraa: piirteet muodostavat matriisin, kertoimet muodostavat vektorin ja ennuste on yksittäinen %-tulo. Monet koneoppiminen Siksi paketit vaativat syötteeksi numeerisen matriisin datakehyksen sijaan.

Kyllä. GitHub Copilot toimii RStudio 2023.09.0:ssa ja uudemmissa versioissa ja täydentää koodin avoimen tiedoston kommenttien perusteella. Tarkista sen ulottuvuuslogiikka kohdassa RStudio, koska väärä nrivi tuottaa silti kelvollisen matriisin.

Tiivistä tämä viesti seuraavasti: