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.

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.
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.
Udskriv dimensionen af matrix_a med dim()
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:
Udskriv dimensionen af matrix_b med dim()
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
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.




