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.

  • 🧩 Strukturera: En matris är en vektor med ett dim-attribut, så varje cell måste dela en datatyp.
  • 🛠️ Skapande: matrix(data, nrow, ncol, byrow) arrangerar en sekvens, och R härleder den saknade dimensionen.
  • 🔄 Fyll i beställning: byrow = FALSE fyller kolumn för kolumn, medan byrow = TRUE fyller rad för rad.
  • Tillväxt: cbind() lägger till kolumner och rbind() lägger till rader, förutsatt att den delade dimensionen matchar.
  • Skiva: m[rad, kolumn] läser raderna först, och en tom sida markerar allt på den sidan.
  • 🏷️ Returfrakt och etiketter: dimnames, rownames() och colnames() ersätter [,1] platshållare med läsbara namn.
  • ➕➖ Aritmetisk: Asterisken multiplicerar element för element, medan %*% utför matrismultiplikation.

Matrisfunktion i R Skapa Skriv ut Lägg till kolumn och sektor

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.

Rad- och kolumnlayout för en matrisfunktion i R

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.

Konsolutdata från matrix_a fylld rad för rad med byrow = TRUE

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:

Konsolutdata från matrix_b fylls kolumn för kolumn med byrow = FALSE

Å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

Konsolresultat för de fyra matrisslicingsuttrycken i R

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.

Vanliga frågor

R återanvänder värdena snarare än att förkasta dem, så matrix(1:3, nrow = 2, ncol = 3) upprepar sekvensen. En varning visas bara när längden inte är en exakt multipel av cellantalet, vilket gör tyst återvinning till en bugg som är lätt att missa.

Använd ett negativt index: m[-2, ] tar bort den andra raden och m[, -3] tar bort den tredje kolumnen. Flera objekt kan användas samtidigt med m[-c(1, 4), ]. Det ursprungliga objektet är oförändrat tills du tilldelar resultatet tillbaka.

Om man väljer en enskild rad eller kolumn tas den tomma dimensionen bort som standard. Lägg till drop = FALSE, som i m[1, , drop = FALSE], för att behålla en enradig matris. Detta är viktigt när resultatet skickas till en funktion som förväntar sig två dimensioner.

which(m == value, arr.ind = TRUE) returnerar ett resultat med två kolumner som anger raden och kolumnen för varje matchning. Utan arr.ind är svaret ett enda linjärt index som räknas ner längs kolumnerna, vilket sällan är vad man vill ha.

Använd array(data, dim = c(rows, columns, layers)) eller tilldela dim(x) direkt till en vektor. Slicing tar då ett index per dimension, såsom a[2, 3, 1]. En matris är helt enkelt det tvådimensionella fallet av en array.

Ja. Basreferensen i R anger att rowSums och colMeans är likvärdiga med apply() med sum eller mean men mycket snabbare, och båda slår en explicit for-loop eftersom iterationen sker i kompilerad kod snarare än i tolken.

Modellanpassning är linjär algebra: funktioner bildar en matris, koefficienter bildar en vektor och prediktion är en enda %*%-produkt. Många maskininlärning paket kräver därför en numerisk matris snarare än en dataram som indata.

Ja. GitHub Copilot körs i RStudio 2023.09.0 och senare och kompletterar kod från kommentarerna i den öppna filen. Kontrollera dess dimensionslogik i RStudio, eftersom ett felaktigt nummer fortfarande producerar en giltig matris.

Sammanfatta detta inlägg med: