Matrixfunctie in R: creëren, afdrukken, kolom en segment toevoegen

⚡ Slimme samenvatting

Een matrix in R is een tweedimensionale array die één gegevenstype bevat, verdeeld over m rijen en n kolommen. Deze arrays worden gemaakt met `matrix()`, uitgebreid met `cbind()` en `rbind()`, en toegankelijk via vierkante haken.

  • 🧩 Structuur: Een matrix is ​​een vector met een dimensie-attribuut, dus elke cel moet hetzelfde gegevenstype hebben.
  • Creation: matrix(data, nrow, ncol, byrow) rangschikt een reeks, en R leidt de ontbrekende dimensie af.
  • 🔄 Vul de bestelling in: `byrow = FALSE` vult kolom voor kolom, terwijl `byrow = TRUE` rij voor rij vult.
  • Groei: cbind() voegt kolommen samen en rbind() voegt rijen samen, mits de gedeelde dimensie overeenkomt.
  • Snijden: m[rij, kolom] leest eerst de rijen, en een lege zijde selecteert alles aan die zijde.
  • ???? ️ labels: dimnames, rownames() en colnames() vervangen [,1]-placeholders door leesbare namen.
  • ➕➖ Rekenkundig: Het sterretje vermenigvuldigt element voor element, terwijl %*% matrixvermenigvuldiging uitvoert.

Matrixfunctie in R: Maak, print, voeg kolommen toe en slice

Matrixfunctie in R

Een matrixfunctie in R is een tweedimensionale array met m aantal rijen en n aantal kolommen. Met andere woorden: matrix in R-programmering is een combinatie van twee of meer vectoren met hetzelfde gegevenstype.

In essentie is een matrix niets meer dan een vector met een `dim` attribuut van lengte twee. Daarom moet elk element hetzelfde type hebben: zodra een tekenwaarde aan getallen wordt gekoppeld, wordt de hele matrix geconverteerd naar een teken. R slaat de waarden op in één enkele kolom en gebruikt `dim` om te bepalen waar elke rij eindigt, dus de keuze van data type Dit geldt voor het hele object tegelijk.

Let op: De functie `matrix()` retourneert altijd precies twee dimensies. Om een ​​structuur met drie of meer dimensies in R te bouwen, gebruikt u `array()` met een vector van dimensies, of wijst u `dim()` rechtstreeks toe. Het onderstaande diagram toont de rij- en kolomindeling die elke matrix volgt.

Indeling van rijen en kolommen van een matrixfunctie in R

Hoe maak je een matrix in R

We kunnen een matrix maken met de functie Matrix()De standaard R-signatuur accepteert vijf argumenten, waarvan de drie meest gebruikte hieronder worden weergegeven:

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

Argumenten:

  • gegevens: De verzameling elementen die R in de rijen en kolommen van de matrix zal rangschikken.
  • nu: Aantal rijen.
  • NcoI: Aantal kolommen.
  • bijrij: Een logische vlag. Met de standaardwaarde byrow = FALSE wordt de matrix kolom voor kolom van boven naar beneden gevuld. Met byrow = TRUE wordt deze rij voor rij van links naar rechts gevuld.
  • dimnamen: Een optionele lijst van twee elementen met de rijnamen en kolomnamen.

Twee details uit de basisreferentie van R zijn het vermelden waard voordat we met het eerste voorbeeld beginnen. Als slechts één van de waarden voor nrow of ncol is opgegeven, leidt R de andere af uit de lengte van de data. En als de data te weinig elementen bevat om de gevraagde vorm te vullen, worden de waarden hergebruikt in plaats van afgewezen.

Laten we twee 5×2 matrices maken van de getallenreeks 1 tot en met 10, één met byrow = TRUE en één met byrow = FALSE, om het verschil te zien.

# 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:

Omdat byrow = TRUE is gebruikt, vult de console de eerste rij met 1 en 2, de tweede rij met 3 en 4, enzovoort.

Console-uitvoer van matrix_a gevuld rij voor rij met byrow = TRUE

Laten we nu de dimensie van de matrix in R afdrukken met dim(). De syntaxis om matrix in R af te drukken met dim() is:

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

Output:

## [1] 5 2

dim() retourneert eerst het aantal rijen en vervolgens het aantal kolommen, wat de 5×2-vorm bevestigt.

Vul een matrix per kolom met byrow = FALSE

Dezelfde tien getallen en hetzelfde aantal rijen leveren een andere opstelling op zodra de vulrichting verandert. Keeping Standaard stuurt byrow de waarden door naar de eerste kolom voordat de tweede begint.

# 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:

Console-uitvoer van matrix_b gevuld kolom voor kolom met byrow = FALSE

Druk opnieuw de dimensie van de matrix af met dim(). Hieronder vindt u een syntaxis van de R-afdrukmatrixdimensie:

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

Output:

## [1] 5 2

De vorm blijft onveranderd bij 5×2, omdat byrow de volgorde van de vulling verandert en nooit de afmetingen.

NoteHet gebruik van de opdracht matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) heeft hetzelfde effect als hierboven, aangezien R nrow = 5 afleidt uit de tien opgegeven waarden.

Je kunt ook een 4×3 matrix maken met ncol. R maakt dan 3 kolommen aan en vult elke kolom van boven naar beneden. Bekijk een voorbeeld.

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

De kolomkoppen [,1] tot [,3] en de rijlabels [1,] tot [4,] zijn standaard placeholders van R. Ze verdwijnen zodra er echte dimensienamen worden ingevoerd, zoals later in deze handleiding wordt getoond.

Voorbeeld:

dim(matrix_c)

Output:

## [1] 4 3

Voeg een kolom toe aan een matrix met de cbind()

Je kunt een kolom toevoegen aan een matrix in R met het commando `cbind()`. `cbind()` staat voor kolomkoppeling en kan zoveel matrices of kolommen samenvoegen als je opgeeft. In ons vorige voorbeeld maakten we bijvoorbeeld een 5×2 matrix. We voegen een derde kolom toe en controleren of de dimensie 5×3 is.

Voorbeeld:

# 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

Voorbeeld:

matrix_a1

uitgang

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

Voorbeeld:

We kunnen ook meerdere kolommen tegelijk binden. Het volgende blok bouwt matrix_a2, een 4×3 matrix met de getallen 13 tot en met 24, zodat deze kan worden samengevoegd met de 4×3 matrix_c om een ​​4×6 resultaat te produceren dat de getallen 1 tot en met 24 omvat.

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

Voorbeeld:

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

Output:

## [1] 4 6

NOTITIEHet aantal rijen van de matrices in R moet gelijk zijn wil cbind() werken. Als ze verschillen, hergebruikt R ofwel de matrices met het kleinste aantal rijen, ofwel geeft een foutmelding. Het is daarom veiliger om eerst dim() op beide objecten te controleren.

Waar cbind() kolommen samenvoegt, voegt rbind() rijen toe. Laten we één rij toevoegen aan onze matrix_c en controleren of de dimensie 5×3 is.

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

Merk op dat het binden van een benoemde vector, zoals add_row, de nieuwe rij ook die naam geeft. Dit is de eerste stap naar de gelabelde matrices die verderop aan bod komen.

Snijd een matrix

We kunnen één of meerdere elementen uit een matrix selecteren in R programmeren Door gebruik te maken van vierkante haken [ ]. Binnen de haken komt de rijselector eerst en de kolomselector daarna, gescheiden door een komma. Dit is waar slicing in beeld komt.

Bijvoorbeeld:

  • matrix_c[1,2] selecteert het element in de eerste rij en tweede kolom.
  • matrix_c[1:3,2:3] resulteert in een R-slice-matrix met de gegevens op de rijen 1, 2, 3 en kolommen 2 en 3.
  • matrix_c[,1] selecteert alle elementen van de eerste kolom.
  • matrix_c[1,] selecteert alle elementen van de eerste rij.

Als je een kant van de komma leeg laat, betekent dit dat elke waarde aan die kant wordt meegenomen. Een gevolg hiervan is dat beginners vaak over het hoofd zien: wanneer een enkele rij of kolom wordt geselecteerd, verwijdert R de lege dimensie en geeft een gewone vector terug. Door drop = FALSE toe te voegen, zoals in matrix_c[1, , drop = FALSE], blijft het resultaat een matrix.

Hier is de uitvoer die u krijgt voor de bovenstaande codes

Console-resultaten van de vier matrix-slicing-expressies in R

Benoem de rijen en kolommen van een matrix in R.

Standaardlabels zoals [,1] en [3,] maken de uitvoer moeilijk leesbaar zodra een matrix daadwerkelijk betekenis heeft. Het argument dimnames, en de vervangingsfuncties rownames() en colnames(), voegen tekstlabels toe die vervolgens met de matrix meereizen tijdens cbind(), t() en elke slice-bewerking.

# 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']
Functie leest Sets
dimnames(m) Beide dimensies als een lijst van twee vectoren dimnames(m) <- list(rijen, kolommen)
rijnamen(m) De rijlabels rijnamen(m) <- rijen
kolomnamen(m) De kolomlabels colnames(m) <- cols
dim(m) Rijen en kolommen als twee gehele getallen dim(m) <- c(nrow, ncol)

Zodra de labels bestaan, is sales['north', 'q2'] veel duidelijker dan sales[1, 2] en blijft het behouden na het herschikken van de rijen. Door een dimnames-component op NULL te zetten, wordt die set labels weer verwijderd, en een matrix die is geconverteerd met as.data.frame() behoudt de rij- en kolomnamen direct in de matrix. dataframe.

Matrix OperaFuncties in R: Rekenen, Transponeren en Vermenigvuldigen

Rekenen met matrices is waar de regel van één type echt van pas komt. Standaard R kan de hele set aan zonder extra pakket, maar twee operatoren worden gemakkelijk door elkaar gehaald: * vermenigvuldigt element voor element, terwijl %*% echte matrixvermenigvuldiging uitvoert en vereist dat de kolommen van de linker operand overeenkomen met de rijen van de rechter.

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): Transponeert de matrix, zodat element [i, j] [j, i] wordt. Dimnames worden overgenomen.
  • oplossen(m): Retourneert de inverse van een vierkante, niet-singuliere matrix, en solve(a, b) lost een lineair stelsel op.
  • rijSommen / kolomSommen / rijGemiddelden / kolomGemiddelden: Gedocumenteerd als equivalent aan apply() met sum of mean, maar aanzienlijk sneller.
  • apply(m, MARGIN, FUN): MARGIN = 1 doorloopt de rijen en MARGIN = 2 doorloopt de kolommen, voor elke functie die je opgeeft.
  • diag, det, crossprod: Diagonaal, determinant en de snellere vorm van t(x) %*% y.

Omdat deze bewerkingen gevectoriseerd zijn, vervangen ze lussen in plaats van erin te zitten. Een samenvatting die normaal gesproken een geneste for-lus over duizenden cellen zou vereisen, wordt nu een enkele aanroep van colMeans(), wat van belang is zodra de data groeit.

Matrix versus DataFrame versus Array in R

Matrices, dataframes en arrays zien er in de console allemaal rechthoekig uit, maar ze beantwoorden verschillende vragen. De tabel zet ze naast elkaar.

Eigendom Matrix Data frame reeks
Afmetingen Precies 2 Precies 2 Elk nummer
Kolomtypen Eén type voor het hele object Een ander type per kolom Eén type voor het hele object
Gebouwd met Matrix() data.frame() reeks()
Typisch gebruik Numerieke berekeningen en lineaire algebra Gemengde observatiegegevens Gestapelde tabellen, zoals tellingen per jaar.
Rijlabels Optionele dimnamen Rijnamen altijd aanwezig Optionele dimnamen
# 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')

Pak een matrix erbij als elke cel hetzelfde soort getal bevat en het werk rekenkundig is. Pak een dataframe wanneer kolommen verschillende gegevenstypen bevatten, bijvoorbeeld een tekenreeksnaam naast een numerieke prijs en een factor. Pak een lijst Dit is handig wanneer de onderdelen verschillende lengtes hebben, en bij een array wanneer een derde index, zoals tijd of regio, daadwerkelijk bestaat. Conversie in beide richtingen is goedkoop met as.matrix() en as.data.frame(), waardoor de structuur de taak kan volgen in plaats van andersom.

Veelgestelde vragen

R hergebruikt de waarden in plaats van ze te verwerpen, dus matrix(1:3, nrow = 2, ncol = 3) herhaalt de reeks. Er verschijnt alleen een waarschuwing als de lengte geen exact veelvoud is van het aantal cellen, waardoor stille hergebruik een gemakkelijk te missen bug is.

Gebruik een negatieve index: m[-2, ] verwijdert de tweede rij en m[, -3] verwijdert de derde kolom. Meerdere rijen kunnen tegelijk worden verwijderd met m[-c(1, 4), ]. Het oorspronkelijke object blijft ongewijzigd totdat je het resultaat teruggeeft.

Als je een enkele rij of kolom selecteert, wordt de lege dimensie standaard verwijderd. Voeg `drop = FALSE` toe, zoals in `m[1, , drop = FALSE]`, om een ​​matrix met één rij te behouden. Dit is belangrijk wanneer het resultaat wordt doorgegeven aan een functie die twee dimensies verwacht.

which(m == value, arr.ind = TRUE) geeft een resultaat met twee kolommen, namelijk de rij en kolom van elke overeenkomst. Zonder arr.ind is het antwoord een enkele lineaire index die de kolommen aftelt, wat zelden gewenst is.

Gebruik array(data, dim = c(rijen, kolommen, lagen)) of wijs dim(x) rechtstreeks toe aan een vector. Slicing gebruikt dan één index per dimensie, zoals a[2, 3, 1]. Een matrix is ​​simpelweg het tweedimensionale geval van een array.

Ja. De basisreferentie van R stelt dat `rowSums` en `colMeans` equivalent zijn aan `apply()` met `sum` of `mean`, maar veel sneller, en beide zijn beter dan een expliciete `for`-lus omdat de iteratie plaatsvindt in gecompileerde code in plaats van in de interpreter.

Modelaanpassing is lineaire algebra: kenmerken vormen een matrix, coëfficiënten vormen een vector en de voorspelling is een enkel %*% product. Veel machine learning De pakketten vereisen daarom een ​​numerieke matrix in plaats van een dataframe als invoer.

Ja. GitHub-copiloot Werkt in RStudio 2023.09.0 en later en vult code aan op basis van de commentaren in het geopende bestand. Controleer de dimensielogica in RStudio, omdat een onjuist aantal rijen nog steeds een geldige matrix oplevert.

Vat dit bericht samen met: