Matrixfunktion i R: Opret, udskriv, tilføj kolonne og udsnit

⚡ Smart opsummering

Matrix i R er et todimensionelt array, der indeholder en enkelt datatype på tværs af m rækker og n kolonner, bygget med matrix(), udvidet med cbind() og rbind(), og nås via firkantede parenteser.

  • 🧩 Struktur: En matrix er en vektor med en dim-attribut, så hver celle skal dele én datatype.
  • 🛠️ Skabelse: matrix(data, nrow, ncol, byrow) arrangerer en sekvens, og R udleder den manglende dimension.
  • 🔄 Udfyld ordre: byrow = FALSE udfylder kolonne for kolonne, mens byrow = TRUE udfylder række for række.
  • Vækst: cbind() tilføjer kolonner og rbind() tilføjer rækker, forudsat at den delte dimension matcher.
  • Skæring: m[række, kolonne] læser rækker først, og en tom side markerer alt på den side.
  • 🏷️ Etiketter: dimnames, rownames() og colnames() erstatter [,1] pladsholdere med læsbare navne.
  • ➕➖ Aritmetik: Stjernen multiplicerer element for element, mens %*% udfører matrixmultiplikation.

Matrixfunktion i R Opret Udskriv Tilføj Kolonne og Udsnit

Matrixfunktion i R

En matrixfunktion i R er en 2-dimensionel matrix, der har m antal rækker og n antal kolonner. Med andre ord er matrix i R-programmering en kombination af to eller flere vektorer med samme datatype.

Nedenfor er en matrix simpelthen en vektor, der bærer en dim-attribut af længde to. Derfor skal hvert element dele én type: i det øjeblik en tegnværdi forbinder tal, tvinges hele matrixen til tegn. R gemmer værdierne i en enkelt kolonnevis kørsel og bruger dim til at bestemme, hvor hver række slutter, så valget af datatype gælder for hele objektet på én gang.

Bemærk: matrix() returnerer altid præcis to dimensioner. For at opbygge en struktur med tre eller flere dimensioner i R, brug array() med en dim-vektor, eller tildel dim() direkte. Diagrammet nedenfor viser række- og kolonnelayoutet, som hver matrix følger.

Række- og kolonnelayout for en matrixfunktion i R

Sådan opretter du en matrix i R

Vi kan oprette en matrix med funktionen matrix()Den grundlæggende R-signatur tager fem argumenter, og de tre oftest anvendte er vist her:

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

argumenter:

  • data: Den samling af elementer, som R vil arrangere i rækker og kolonner i matrixen.
  • indsnævreAntal rækker.
  • ncolAntal kolonner.
  • byrowEt logisk flag. Med standardværdien byrow = FALSE udfyldes matricen kolonne for kolonne, top til bund. Med byrow = TRUE udfyldes den række for række, fra venstre mod højre.
  • dimnavneEn valgfri liste med længde to, der angiver rækkenavnene og kolonnenavnene.

To detaljer fra den grundlæggende R-reference er værd at kende før det første eksempel. Hvis kun den ene af nrow og ncol er angivet, udleder R den anden fra datalængden. Og hvis data indeholder for få elementer til at udfylde den form, du bad om, genbruges værdierne i stedet for at blive afvist.

Lad os konstruere to 5×2-matricer ud fra talfølgen 1 til 10, en med byrow = SAND og en med byrow = FALSK, for at se forskellen.

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

Fordi byrow = TRUE blev brugt, udfylder konsollen den første række med 1 og 2, den anden række med 3 og 4, og så videre.

Konsoloutputtet fra matrix_a udfyldt række for række med byrow = TRUE

Lad os nu udskrive dimensionen af ​​matricen i R med dim(). Syntaksen til at udskrive matrix i R ved hjælp af dim() er:

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

Output:

## [1] 5 2

dim() returnerer først rækkeantallet og derefter kolonneantallet, hvilket bekræfter 5×2-formen.

Udfyld en matrix efter kolonne med byrow = FALSE

De samme ti tal og det samme nummer giver et andet arrangement, når fylderetningen ændres.ping byrow sender som standard værdierne ned i den første kolonne, før den anden starter.

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

Konsoloutputtet fra matrix_b udfyldt kolonne for kolonne med byrow = FALSE

Igen, udskriv dimensionen af ​​matrixen ved hjælp af dim(). Nedenfor er en syntaks for R printmatrixdimension:

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

Output:

## [1] 5 2

Formen er uændret ved 5×2, fordi byrow ændrer fyldningsrækkefølgen og aldrig dimensionerne.

BemærkBrug af kommandoen matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) vil have samme effekt som ovenfor, da R udleder nrow = 5 fra de ti angivne værdier.

Du kan også oprette en 4×3-matrix ved hjælp af ncol. R opretter 3 kolonner og udfylder hver kolonne fra top til bund. Se et eksempel

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

Kolonneoverskrifterne [,1] til [,3] og rækkenavnene [1,] til [4,] er R's standardpladsholdere. De forsvinder, så snart rigtige dimnames angives, som vist senere i denne vejledning.

Eksempel:

dim(matrix_c)

Output:

## [1] 4 3

Tilføj en kolonne til en matrix med cbind()

Du kan tilføje en kolonne til matrix R med kommandoen cbind(). cbind() betyder kolonnebinding, og den kan sammenkæde så mange matricer eller kolonner som angivet. For eksempel oprettede vores tidligere eksempel en 5×2-matrix. Vi sammenkæder en tredje kolonne og verificerer, at dimensionen er 5×3.

Eksempel:

# 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

Eksempel:

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

Eksempel:

Vi kan også binde mere end én kolonne ad gangen. Den næste blok bygger matrix_a2, en 4×3-matrix, der indeholder tallene 13 til 24, så den kan forbindes med 4×3-matrix_c for at producere et 4×6-resultat, der dækker 1 til 24.

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

Eksempel:

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

Output:

## [1] 4 6

BEMÆRKAntallet af rækker af matricerne i R skal være ens for at cbind() kan fungere. Når de er forskellige, genbruger R enten det kortere input eller genererer en fejl, så det er en mere sikker vane at kontrollere dim() på begge objekter først.

Hvor cbind() sammenkæder kolonner, tilføjer rbind() rækker. Lad os tilføje én række til vores matrix_c-matrix og bekræfte, at dimensionen er 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

Bemærk at binding af en navngivet vektor, såsom add_row, også giver den nye række det navn, hvilket er det første skridt mod de mærkede matricer, der er dækket længere nede.

Skær en matrix i skiver

Vi kan vælge et eller flere elementer fra en matrix i R programmering ved at bruge de firkantede parenteser []. Inde i parenteserne kommer rækkevælgeren først og kolonnevælgeren derefter, adskilt af et komma. Det er her, slicing kommer ind i billedet.

For eksempel:

  • matrix_c[1,2] vælger elementet i den første række og anden kolonne.
  • matrix_c[1:3,2:3] resulterer i en R-slice-matrix med dataene på rækkerne 1, 2, 3 og kolonnerne 2 og 3.
  • matrix_c[,1] vælger alle elementer i den første kolonne.
  • matrix_c[1,] vælger alle elementer i den første række.

Hvis man lader en side af kommaet stå tom, betyder det derfor, at alle værdier på den side er blanke. Én konsekvens fanger begyndere: Når en enkelt række eller kolonne er valgt, fjerner R den tomme dimension og giver en almindelig vektor tilbage. Tilføjelse af drop = FALSK, som i matrix_c[1, , drop = FALSK], bevarer resultatet som en matrix.

Her er det output, du får for ovenstående koder

Konsolresultater af de fire matrixslicing-udtryk i R

Navngiv rækkerne og kolonnerne i en matrix i R

Standardbetegnelser som [,1] og [3,] gør outputtet svært at læse, så snart en matrix har en reel betydning. Argumentet dimnames og erstatningsfunktionerne rownames() og colnames() vedhæfter tekstbetegnelser, der derefter følger matricen gennem cbind(), t() og hver 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 sæt
dimnames(m) Begge dimensioner som en liste af to vektorer dimnames(m) <- liste(rækker, kolonner)
rækkenavne(m) Rækkeetiketterne rækkenavne(m) <- rækker
kolonnenavne (m) Kolonneetiketterne kolonnenavne(m) <- kolonner
dim(m) Rækker og kolonner som to heltal dim(m) <- c(nrow, ncol)

Når etiketterne findes, er sales['north', 'q2'] langt tydeligere end sales[1, 2] og overlever en ændring af rækkerækkefølgen. Hvis en dimnames-komponent sættes til NULL, fjernes dette sæt etiketter igen, og en matrix, der konverteres med as.data.frame(), fører dens række- og kolonnenavne direkte ind i dataramme.

Matrix Operationer i R: Aritmetik, transponering og multiplikation

I matricer er det aritmetik, hvor enkelttype-reglen giver pote. Basis R håndterer hele sættet uden en ekstra pakke, men to operatorer er lette at forveksle: * multiplicerer element for element, mens %*% udfører ægte matrixmultiplikation og kræver, at kolonnerne i den venstre operand matcher rækkerne i den højre.

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)Transponerer matricen, så elementet [i, j] bliver til [j, i]. Dimnavne overføres.
  • løs(m)Returnerer den inverse værdi af en kvadratisk, ikke-singular matrix, og solve(a, b) løser et lineært system.
  • rækkesummer / kolonnesummer / rækkemiddel / kolonnemiddelDokumenteret som ækvivalent til apply() med sum eller mean, men meget hurtigere.
  • anvend(m, MARGIN, SJOV)MARGIN = 1 bruger rækkerne, og MARGIN = 2 bruger kolonnerne, for enhver funktion du angiver.
  • diag, det, krydsprodDiagonal, determinant og den hurtigste form af t(x) %*% y.

Fordi disse operationer er vektoriserede, erstatter de løkker i stedet for at sidde indeni dem. En opsummering, der ville kræve en indbygget for-løkke over tusindvis af celler, bliver til et enkelt colMeans()-kald, hvilket betyder noget, så snart dataene vokser.

Matrix vs. dataramme vs. array i R

Matricer, datarammer og arrays ser alle rektangulære ud i konsollen, men de besvarer forskellige spørgsmål. Tabellen sætter dem side om side.

Ejendom Matrix Dataramme Array
Mål Præcis 2 Præcis 2 Ethvert nummer
Kolonnetyper Én type for hele objektet En forskellig type pr. kolonne Én type for hele objektet
Bygget med matrix() data.frame() array()
Typisk brug Numerisk beregning og lineær algebra Blandede observationsdata Stablede tabeller, f.eks. optællinger efter år
Rækkeetiketter Valgfri dimnavne Rækkenavne er altid til stede Valgfri dimnavne
# 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')

Ræk ud efter en matrix, når hver celle er den samme slags tal, og arbejdet er aritmetisk. Ræk ud efter en dataramme når kolonner har forskellige typer, for eksempel et tegnnavn ved siden af ​​en numerisk pris og en faktorRæk ud efter en liste når delene har forskellige længder, og for et array når et tredje indeks, såsom tid eller region, rent faktisk eksisterer. Konvertering i begge retninger er billig med as.matrix() og as.data.frame(), så strukturen kan følge opgaven i stedet for omvendt.

Ofte Stillede Spørgsmål

R genbruger værdierne i stedet for at afvise dem, så matrix(1:3, nrow = 2, ncol = 3) gentager sekvensen. En advarsel vises kun, når længden ikke er et eksakt multiplum af celleantallet, hvilket gør lydløs genbrug til en nem fejl at overse.

Brug et negativt indeks: m[-2, ] fjerner den anden række, og m[, -3] fjerner den tredje kolonne. Flere kan bruges på én gang med m[-c(1, 4), ]. Det oprindelige objekt forbliver uændret, indtil du tildeler resultatet tilbage.

Hvis du vælger en enkelt række eller kolonne, slettes den tomme dimension som standard. Tilføj drop = FALSK, som i m[1, , drop = FALSK], for at bevare en matrix med én række. Dette er vigtigt, når resultatet sendes til en funktion, der forventer to dimensioner.

which(m == value, arr.ind = TRUE) returnerer et resultat med to kolonner, der angiver rækken og kolonnen for hvert match. Uden arr.ind er svaret et enkelt lineært indeks, der tælles ned gennem kolonnerne, hvilket sjældent er det, man ønsker.

Brug array(data, dim = c(rows, columns, layers)) eller tildel dim(x) direkte på en vektor. Slicing tager derefter ét indeks pr. dimension, såsom a[2, 3, 1]. En matrix er simpelthen det todimensionelle tilfælde af et array.

Ja. Den grundlæggende R-reference angiver, at rowSums og colMeans svarer til apply() med sum eller mean, men er meget hurtigere, og begge slår en eksplicit for-løkke, fordi iterationen sker i kompileret kode snarere end i fortolkeren.

Modeltilpasning er lineær algebra: funktioner danner en matrix, koefficienter danner en vektor, og forudsigelse er et enkelt %*% produkt. Mange machine learning Pakker kræver derfor en numerisk matrix i stedet for en dataramme som input.

Ja. GitHub Copilot kører i RStudio 2023.09.0 og nyere og fuldfører kode fra kommentarerne i den åbne fil. Tjek dens dimensionslogik i RStudio, fordi et forkert nummer stadig producerer en gyldig matrix.

Opsummer dette indlæg med: