Matrisfunktion i R: Skapa, skriv ut, lägg till kolumn och skiva
⚡ Smart sammanfattning
En matris i R är en tvådimensionell array som innehåller en enda datatyp över m rader och n kolumner, byggd med matrix(), utökad med cbind() och rbind(), och nås genom hakparenteser.
Matrisfunktion i R
En matrisfunktion i R är en 2-dimensionell matris som har m antal rader och n antal kolumner. Med andra ord är matris i R-programmering en kombination av två eller flera vektorer med samma datatyp.
Nedan är en matris helt enkelt en vektor som bär ett dim-attribut med längden två. Det är därför varje element måste dela en typ: i det ögonblick ett teckenvärde sammanfogar tal, tvingas hela matrisen till tecken. R lagrar värdena i en enda kolumnvis körning och använder dim för att bestämma var varje rad slutar, så valet av data typ gäller hela objektet på en gång.
Obs: matrix() returnerar alltid exakt två dimensioner. För att bygga en struktur med tre eller fler dimensioner i R, använd array() med en dim-vektor, eller tilldela dim() direkt. Diagrammet nedan visar rad- och kolumnlayouten som varje matris följer.
Hur man skapar en matris i R
Vi kan skapa en matris med funktionen matris()Bassignaturen i R tar fem argument, och de tre som används oftast visas här:
matrix(data, nrow, ncol, byrow = FALSE)
argument:
- datum: Samlingen av element som R kommer att arrangera i matrisens rader och kolumner.
- trångaAntal rader.
- ncolAntal kolumner.
- byrowEn logisk flagga. Med standardvärdet byrow = FALSE fylls matrisen kolumn för kolumn, uppifrån och ned. Med byrow = TRUE fylls den rad för rad, från vänster till höger.
- dimnamnEn valfri lista med längd två som anger radnamnen och kolumnnamnen.
Två detaljer från R-basreferensen är värda att känna till innan det första exemplet. Om bara en av nrow och ncol anges, härleder R den andra från datalängden. Och om data innehåller för få element för att fylla den form du begärt, återvinns värdena snarare än förkastas.
Låt oss konstruera två 5×2-matriser från talföljden 1 till 10, en med byrow = SANT och en med byrow = FALSKT, för att se skillnaden.
# 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
Produktion:
Eftersom byrow = TRUE användes fyller konsolen den första raden med 1 och 2, den andra raden med 3 och 4, och så vidare.
Skriv ut dimensionen för matrix_a med dim()
Låt oss nu skriva ut dimensionen för matrisen i R med dim(). Syntaxen för att skriva ut matris i R med dim() är:
# Print dimension of the matrix with dim()
dim(matrix_a)
Produktion:
## [1] 5 2
dim() returnerar radantalet först och kolumnantalet därefter, vilket bekräftar 5×2-formen.
Fyll en matris per kolumn med byrow = FALSE
Samma tiotal och samma nummer ger ett annat arrangemang när fyllningsriktningen ändras.ping byrow skickar som standard värdena ner i den första kolumnen innan den andra börjar.
# 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
Produktion:
Skriv ut dimensionen för matrix_b med dim()
Återigen, skriv ut dimensionen på matrisen med dim(). Nedan finns en syntax för R utskriftsmatrisdimension:
# Print dimension of the matrix with dim()
dim(matrix_b)
Produktion:
## [1] 5 2
Formen är oförändrad vid 5×2, eftersom byrow ändrar fyllningsordningen och aldrig dimensionerna.
AnmärkningarAtt använda kommandot matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) kommer att ha samma effekt som ovan, eftersom R härleder nrow = 5 från de tio angivna värdena.
Du kan också skapa en 4×3-matris med hjälp av ncol. R skapar 3 kolumner och fyller varje kolumn uppifrån och ner. Se ett exempel
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Produktion:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Kolumnrubrikerna [,1] till [,3] och radetiketterna [1,] till [4,] är R:s standardplatshållare. De försvinner så snart riktiga dimnamn anges, vilket visas senare i den här handledningen.
Exempel:
dim(matrix_c)
Produktion:
## [1] 4 3
Lägg till en kolumn till en matris med cbind()
Du kan lägga till en kolumn till matris R med kommandot cbind(). cbind() betyder kolumnbindning och kan sammanfoga så många matriser eller kolumner som anges. Till exempel skapade vårt tidigare exempel en 5×2-matris. Vi sammanfogar en tredje kolumn och verifierar att dimensionen är 5×3.
Exempel:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Produktion:
## [1] 5 3
Exempel:
matrix_a1
Produktion
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Exempel:
Vi kan också binda mer än en kolumn åt gången. Nästa block bygger matrix_a2, en 4×3-matris som innehåller talen 13 till 24, så att den kan kopplas till 4×3-matrisen_c för att producera ett 4×6-resultat som täcker 1 till 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Produktion:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Exempel:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Produktion:
## [1] 4 6
ANMÄRKNINGARAntalet rader i matriserna i R måste vara lika för att cbind() ska fungera. När de skiljer sig åt återanvänder R antingen den kortare inmatningen eller genererar ett fel, så att kontrollera dim() på båda objekten först är en säkrare vana.
Där cbind() sammanfogar kolumner, lägger rbind() till rader. Låt oss lägga till en rad i vår matrix_c-matris och verifiera att dimensionen är 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)
Produktion:
## [1] 5 3
Observera att bindning av en namngiven vektor som add_row också ger den nya raden det namnet, vilket är det första steget mot de märkta matriserna som behandlas längre ner.
Skiva en matris
Vi kan välja ett eller flera element från en matris i R-programmering genom att använda hakparenteserna []. Inom hakparenteserna kommer radväljaren först och kolumnväljaren som nummer två, separerade med ett kommatecken. Det är här slicing kommer in i bilden.
Till exempel:
- matrix_c[1,2] väljer elementet i den första raden och den andra kolumnen.
- matrix_c[1:3,2:3] resulterar i en R-segmentmatris med data på raderna 1, 2, 3 och kolumnerna 2 och 3.
- matrix_c[,1] väljer alla element i den första kolumnen.
- matrix_c[1,] väljer alla element i den första raden.
Att lämna en sida av kommatecken tom innebär därför att alla värden på den sidan förblir. En konsekvens fångar nybörjare: när en enda rad eller kolumn väljs, tar R bort den tomma dimensionen och ger tillbaka en vanlig vektor. Att lägga till drop = FALSE, som i matrix_c[1, , drop = FALSE], behåller resultatet som en matris.
Här är utdata du får för ovanstående koder
Namnge raderna och kolumnerna i en matris i R
Standardetiketter som [,1] och [3,] gör utdata svårlästa så snart en matris har en verklig betydelse. Argumentet dimnames och ersättningsfunktionerna rownames() och colnames() bifogar textetiketter som sedan följer med matrisen genom cbind(), t() och varje slicing-operation.
# 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']
| Funktion | läser | uppsättningar |
|---|---|---|
| dimnamn(m) | Båda dimensionerna som en lista med två vektorer | dimnamn(m) <- lista(rader, kolumner) |
| radnamn(m) | Radetiketterna | radnamn(m) <- rader |
| kolumnnamn (m) | Kolumnetiketterna | kolumnnamn(m) <- kolumner |
| dim(m) | Rader och kolumner som två heltal | dim(m) <- c(nrow, ncol) |
När etiketterna väl finns är sales['north', 'q2'] mycket tydligare än sales[1, 2] och överlever en omordning av raderna. Om en dimnames-komponent sätts till NULL tas den uppsättningen etiketter bort igen, och en matris som konverteras med as.data.frame() bär sina rad- och kolumnnamn direkt in i dataram.
Matris Operationer i R: Aritmetik, Transponering och Multiplikation
I aritmetik på matriser lönar sig entypsregeln. Bas R hanterar hela mängden utan ett extra paket, men två operatorer är lätta att förväxla: * multiplicerar element för element, medan %*% utför äkta matrismultiplikation och kräver att kolumnerna i den vänstra operanden matchar raderna i den högra.
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)Transponerar matrisen, så elementet [i, j] blir [j, i]. Dimnamn överförs.
- lös(m)Returnerar inversen av en kvadratisk, icke-singulär matris, och solve(a, b) löser ett linjärt system.
- radSummor / kolumnSummor / radMedan / kolumnMedanDokumenterad som likvärdig med apply() med sum eller mean, men mycket snabbare.
- tillämpa(m, MARGINAL, KUL)MARGIN = 1 följer raderna och MARGIN = 2 följer kolumnerna, för alla funktioner du anger.
- diag, det, korsproduktDiagonal, determinant och den snabbare formen av t(x) %*% y.
Eftersom dessa operationer är vektoriserade ersätter de loopar snarare än att sitta inuti dem. En sammanfattning som skulle ta en kapslad for-loop över tusentals celler blir ett enda colMeans()-anrop, vilket spelar roll så snart datamängden växer.
Matris vs. dataram vs. array i R
Matriser, dataramar och arrayer ser alla rektangulära ut i konsolen, men de besvarar olika frågor. Tabellen placerar dem sida vid sida.
| Fast egendom | Matris | Dataram | array |
|---|---|---|---|
| Mått | Exakt 2 | Exakt 2 | Vilket nummer som helst |
| Kolumntyper | En typ för hela objektet | En annan typ per kolumn | En typ för hela objektet |
| Byggt med | matris() | data.frame() | array() |
| Typisk användning | Numerisk beräkning och linjär algebra | Blandade observationsdata | Staplade tabeller, till exempel antal per år |
| Radetiketter | Valfria dimnamn | Radnamn finns alltid | Valfria dimnamn |
# 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')
Sträck dig efter en matris när varje cell är av samma sorts tal och arbetet är aritmetiskt. Sträck dig efter en dataram när kolumner har olika typer, till exempel ett teckennamn bredvid ett numeriskt pris och ett faktorSträck dig efter en lista när delarna har olika längder, och för en array när ett tredje index, såsom tid eller region, verkligen existerar. Konvertering i båda riktningarna är billig med as.matrix() och as.data.frame(), så strukturen kan följa uppgiften snarare än tvärtom.





