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: