Matrisefunksjon i R: Opprett, skriv ut, legg til kolonne og del

⚡ Smart oppsummering

Matrise i R er en todimensjonal matrise som inneholder én datatype på tvers av m rader og n kolonner, bygget med matrix(), utvidet med cbind() og rbind(), og nås gjennom hakeparenteser.

  • 🧩 Struktur: En matrise er en vektor med et dim-attributt, så hver celle må dele én datatype.
  • 🛠️ Opprettelse: matrix(data, nrow, ncol, byrow) arrangerer en sekvens, og R utleder den manglende dimensjonen.
  • 🔄 Fyll ut bestilling: byrow = FALSE fyller kolonne for kolonne, mens byrow = TRUE fyller rad for rad.
  • ➕ Vekst: cbind() legger til kolonner og rbind() legger til rader, forutsatt at den delte dimensjonen samsvarer.
  • ✂ Skjæring: m[rad, kolonne] leser rader først, og en blank side velger alt på den siden.
  • 🏷️ etiketter: dimnames, rownames() og colnames() erstatter [,1] plassholdere med lesbare navn.
  • ➕➖ Aritmetikk: Stjernen multipliserer element for element, mens %*% utfører matrisemultiplikasjon.

Matrisefunksjon i R Opprett Skriv ut legg til kolonne og sektor

Matrisefunksjon i R

En matrisefunksjon i R er en 2-dimensjonal matrise som har m antall rader og n antall kolonner. Matrise i R-programmering er med andre ord en kombinasjon av to eller flere vektorer med samme datatype.

Under er en matrise rett og slett en vektor som bærer et dim-attributt med lengde to. Det er derfor hvert element må dele én type: i det øyeblikket en tegnverdi kobler sammen tall, tvinges hele matrisen til tegn. R lagrer verdiene i en enkelt kolonnevis kjøring og bruker dim til å bestemme hvor hver rad slutter, slik at valget av data-type gjelder hele objektet samtidig.

OBS: matrix() returnerer alltid nøyaktig to dimensjoner. For å bygge en struktur med tre eller flere dimensjoner i R, bruk array() med en dim-vektor, eller tilordne dim() direkte. Diagrammet nedenfor viser rad- og kolonneoppsettet som hver matrise følger.

Rad- og kolonneoppsett for en matrisefunksjon i R

Hvordan lage en matrise i R

Vi kan lage en matrise med funksjonen matrise()Den grunnleggende R-signaturen tar fem argumenter, og de tre som brukes oftest vises her:

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

argumenter:

  • dato: Samlingen av elementer som R vil ordne i radene og kolonnene i matrisen.
  • innskrenkeAntall rader.
  • ncolAntall kolonner.
  • byrowEt logisk flagg. Med standardverdien byrow = FALSE fylles matrisen kolonne for kolonne, topp til bunn. Med byrow = TRUE fylles den rad for rad, fra venstre til høyre.
  • dimnavnEn valgfri liste med lengde to som oppgir radnavnene og kolonnenavnene.

To detaljer fra den grunnleggende R-referansen er verdt å vite før det første eksemplet. Hvis bare én av nrow og ncol er gitt, utleder R den andre fra datalengden. Og hvis dataene inneholder for få elementer til å fylle formen du ba om, blir verdiene resirkulert i stedet for å bli avvist.

La oss konstruere to 5×2-matriser fra tallrekken 1 til 10, én med byrow = TRUE og én med byrow = FALSE, for å se forskjellen.

# 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

Utgang:

Fordi byrow = TRUE ble brukt, fyller konsollen den første raden med 1 og 2, den andre raden med 3 og 4, og så videre.

Konsollutdata for matrix_a fylt rad for rad med byrow = TRUE

La oss nå skrive ut dimensjonen til matrisen i R med dim(). Syntaksen for å skrive ut matrise i R ved å bruke dim() er:

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

Utgang:

## [1] 5 2

dim() returnerer radantallet først og kolonneantallet deretter, og bekrefter dermed 5×2-formen.

Fyll en matrise etter kolonne med byrow = FALSE

De samme ti tallene og samme tallet produserer et annet arrangement når fyllingsretningen endres.ping byrow sender som standard verdiene nedover den første kolonnen før den andre 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

Utgang:

Konsollutdata for matrix_b fylt kolonne for kolonne med byrow = FALSE

Igjen, skriv ut dimensjonen til matrisen ved å bruke dim(). Nedenfor er en syntaks for R utskriftsmatrisedimensjon:

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

Utgang:

## [1] 5 2

Formen er uendret ved 5×2, fordi byrow endrer fyllingsrekkefølgen og aldri dimensjonene.

MerknaderBruk av kommandoen matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) vil ha samme effekt som ovenfor, siden R utleder nrow = 5 fra de ti verdiene som er oppgitt.

Du kan også lage en 4×3-matrise ved hjelp av ncol. R vil lage 3 kolonner og fylle hver kolonne ovenfra og ned. Se et eksempel.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

Utgang:

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

Kolonneoverskriftene [,1] til [,3] og radetikettene [1,] til [4,] er standard plassholdere for R. De forsvinner så snart ekte dimnames er oppgitt, som vist senere i denne veiledningen.

Eksempel:

dim(matrix_c)

Utgang:

## [1] 4 3

Legg til en kolonne til en matrise med cbind()

Du kan legge til en kolonne i matrise R med cbind()-kommandoen. cbind() betyr kolonnebinding, og den kan sammenkoble så mange matriser eller kolonner som spesifisert. For eksempel opprettet vårt forrige eksempel en 5×2-matrise. Vi sammenkobler en tredje kolonne og bekrefter at dimensjonen 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)

Utgang:

## [1] 5 3

Eksempel:

matrix_a1

Produksjon

##       [,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 mer enn én kolonne om gangen. Den neste blokken bygger matrix_a2, en 4×3-matrise som inneholder tallene 13 til 24, slik at den kan kobles til 4×3-matrisen_c for å produsere et 4×6-resultat som dekker 1 til 24.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

Utgang:

##      [,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)

Utgang:

## [1] 4 6

MERKNADERAntall rader i matrisene i R må være likt for at cbind() skal fungere. Når de er forskjellige, resirkulerer R enten den kortere inputen eller genererer en feil, så det er tryggere å sjekke dim() på begge objektene først.

Der cbind() sammenkobler kolonner, legger rbind() til rader. La oss legge til én rad i matrisen matrix_c og bekrefte at dimensjonen 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)

Utgang:

## [1] 5 3

Legg merke til at binding av en navngitt vektor, som add_row, også gir den nye raden det navnet, som er det første steget mot de merkede matrisene som dekkes lenger ned.

Skjær en matrise

Vi kan velge ett eller flere elementer fra en matrise i R programmering ved å bruke hakeparentesene []. Innenfor parentesene kommer radvelgeren først og kolonnevelgeren deretter, atskilt med komma. Det er her slicing kommer inn i bildet.

For eksempel:

  • matrix_c[1,2] velger elementet i første rad og andre kolonne.
  • matrix_c[1:3,2:3] resulterer i en R-seksjonsmatrise med dataene på rad 1, 2, 3 og kolonne 2 og 3.
  • matrix_c[,1] velger alle elementene i den første kolonnen.
  • matrix_c[1,] velger alle elementene i den første raden.

Å la en side av kommaet stå tom betyr derfor at alle verdier på den siden er tomme. Én konsekvens avslører nybegynnere: når en enkelt rad eller kolonne velges, fjerner R den tomme dimensjonen og gir tilbake en ren vektor. Ved å legge til drop = FALSE, som i matrix_c[1, , drop = FALSE], beholdes resultatet som en matrise.

Her er utgangen du får for kodene ovenfor

Konsollresultater av de fire matrisedelingsuttrykkene i R

Navngi radene og kolonnene i en matrise i R

Standardetiketter som [,1] og [3,] gjør det vanskelig å lese resultatet så snart en matrise har reell betydning. Argumentet dimnames og erstatningsfunksjonene rownames() og colnames() legger til tekstetiketter som deretter følger matrisen gjennom cbind(), t() og hver slicing-operasjon.

# 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']
Funksjon Leser sett
dimnames(m) Begge dimensjonene som en liste med to vektorer dimnames(m) <- liste(rader, kolonner)
radnavn(m) Radetikettene radnavn(m) <- rader
kolonnenavn(m) Kolonneetikettene kolonnenavn(m) <- kolonner
dim(m) Rader og kolonner som to heltall dim(m) <- c(nrow, ncol)

Når etikettene finnes, er sales['north', 'q2'] mye tydeligere enn sales[1, 2] og overlever en omorganisering av radene. Hvis en dimnames-komponent settes til NULL, fjernes det settet med etiketter igjen, og en matrise konvertert med as.data.frame() fører rad- og kolonnenavnene rett inn i Dataramme.

Matrix Operasjoner i R: Aritmetikk, transponering og multiplikasjon

I aritmetikk på matriser lønner det seg å bruke en-type-regelen. Base R håndterer hele settet uten en ekstra pakke, men to operatorer er lette å forveksle: * multipliserer element for element, mens %*% utfører ekte matrisemultiplikasjon og krever at kolonnene i den venstre operanden samsvarer med radene i den høyre.

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 matrisen, slik at elementet [i, j] blir [j, i]. Dimnavn overføres.
  • løse(m)Returnerer den inverse av en kvadratisk, ikke-singular matrise, og solve(a, b) løser et lineært system.
  • radsummer / kolumsummer / radmiddel / kolummiddelDokumentert som ekvivalent med apply() med sum eller mean, men mye raskere.
  • bruk(m, MARGIN, MORO)MARGIN = 1 går gjennom radene og MARGIN = 2 går gjennom kolonnene, for enhver funksjon du oppgir.
  • diagnose, deteksjon, kryssproduksjonDiagonal, determinant og den raskeste formen av t(x) %*% y.

Fordi disse operasjonene er vektoriserte, erstatter de løkker i stedet for å ligge inni dem. Et sammendrag som ville tatt en nestet for-løkke over tusenvis av celler blir et enkelt colMeans()-kall, noe som er viktig så snart dataene vokser.

Matrise vs. dataramme vs. array i R

Matriser, datarammer og arrayer ser alle rektangulære ut i konsollen, men de svarer på forskjellige spørsmål. Tabellen plasserer dem side om side.

Eiendom Matrix Dataramme Array
Dimensjoner Nøyaktig 2 Nøyaktig 2 Et hvilket som helst tall
Kolonnetyper Én type for hele objektet En annen type per kolonne Én type for hele objektet
Bygget med matrise() data.frame() array()
Typisk bruk Numerisk beregning og lineær algebra Blandede observasjonsdata Stablede tabeller, for eksempel antall etter år
Radetiketter Valgfrie dimnavn Radnavn er alltid til stede Valgfrie dimnavn
# 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')

Rekk etter en matrise når hver celle er av samme type tall og arbeidet er aritmetisk. Rekk etter en Dataramme når kolonner har forskjellige typer, for eksempel et tegnnavn ved siden av en numerisk pris og en faktor. Strekk deg etter en liste når delene har ulik lengde, og for en matrise når en tredje indeks, som tid eller region, faktisk eksisterer. Konvertering i begge retninger er billig med as.matrix() og as.data.frame(), slik at strukturen kan følge oppgaven i stedet for omvendt.

Spørsmål og svar

R resirkulerer verdiene i stedet for å forkaste dem, så matrix(1:3, nrow = 2, ncol = 3) gjentar sekvensen. En advarsel vises bare når lengden ikke er et eksakt multiplum av celleantallet, noe som gjør stille resirkulering til en feil som er lett å overse.

Bruk en negativ indeks: m[-2, ] fjerner den andre raden og m[, -3] fjerner den tredje kolonnen. Flere kan brukes samtidig med m[-c(1, 4), ]. Det opprinnelige objektet forblir uendret inntil du tilordner resultatet tilbake.

Hvis du velger en enkelt rad eller kolonne, fjernes den tomme dimensjonen som standard. Legg til drop = FALSE, som i m[1, , drop = FALSE], for å beholde en matrise med én rad. Dette er viktig når resultatet sendes til en funksjon som forventer to dimensjoner.

which(m == value, arr.ind = TRUE) returnerer et resultat med to kolonner som gir raden og kolonnen for hvert treff. Uten arr.ind er svaret en enkelt lineær indeks som telles nedover kolonnene, noe som sjelden er det du ønsker.

Bruk array(data, dim = c(rows, columns, layers)) eller tilordne dim(x) direkte på en vektor. Slicing tar deretter én indeks per dimensjon, for eksempel a[2, 3, 1]. En matrise er ganske enkelt det todimensjonale tilfellet av en array.

Ja. Den grunnleggende R-referansen sier at rowSums og colMeans er likeverdige med apply() med sum eller mean, men mye raskere, og begge slår en eksplisitt for-løkke fordi iterasjonen skjer i kompilert kode i stedet for i tolken.

Modelltilpasning er lineær algebra: funksjoner danner en matrise, koeffisienter danner en vektor, og prediksjon er et enkelt %*% produkt. Mange maskinlæring Pakker krever derfor en numerisk matrise i stedet for en dataramme som input.

Ja. GitHub Copilot kjører i RStudio 2023.09.0 og nyere og fullfører kode fra kommentarene i den åpne filen. Sjekk dimensjonslogikken i RStudio, fordi en feil tallrekke fortsatt produserer en gyldig matrise.

Oppsummer dette innlegget med: