Funkcija matrice u R: Stvaranje, ispis, dodavanje stupaca i isječak

⚡ Pametni sažetak

Matrica u R-u je dvodimenzionalni niz koji sadrži jedan tip podataka u m redaka i n stupaca, izgrađen s matrix(), proširen s cbind() i rbind(), a dostupan je kroz uglate zagrade.

  • 🧩 Struktura: Matrica je vektor s atributom dim, tako da svaka ćelija mora dijeliti jedan tip podataka.
  • 🛠️ Stvaranje: matrix(data, nrow, ncol, byrow) uređuje niz, a R zaključuje nedostajuću dimenziju.
  • 🔄 Narudžba za popunjavanje: byrow = FALSE ispunjava stupac po stupac, dok byrow = TRUE ispunjava redak po redak.
  • Rast: cbind() dodaje stupce, a rbind() retke, pod uvjetom da se dijeljena dimenzija podudara.
  • Rezanje: m[redak, stupac] prvo čita retke, a prazna strana odabire sve na toj strani.
  • 🏷️ oznake: dimnames, rownames() i colnames() zamjenjuju rezervirana mjesta [,1] čitljivim imenima.
  • ➕➖ Aritmetika: Zvjezdica množi element po elementu, dok %*% izvodi množenje matrica.

Matrična funkcija u R-u Stvaranje Ispis Dodaj stupac i kriška

Matrična funkcija u R

Matrična funkcija u R je dvodimenzionalni niz koji ima m redaka i n stupaca. Drugim riječima, matrica u R programiranju je kombinacija dva ili više vektora s istim tipom podataka.

U nastavku, matrica je jednostavno vektor koji nosi atribut dim duljine dva. Zato svaki element mora dijeliti jedan tip: u trenutku kada se vrijednost znaka spoji s brojevima, cijela matrica se prisiljava na karakter. R pohranjuje vrijednosti u jednom nizu po stupcima i koristi dim za odlučivanje gdje svaki redak završava, pa je izbor tip podataka primjenjuje se na cijeli objekt odjednom.

Bilješka: Sama matrix() uvijek vraća točno dvije dimenzije. Za izgradnju strukture s tri ili više dimenzija u R-u, koristite array() s dim vektorom ili izravno dodijelite dim(). Dijagram u nastavku prikazuje raspored redaka i stupaca koji svaka matrica slijedi.

Raspored redaka i stupaca matrične funkcije u R-u

Kako stvoriti matricu u R

Možemo stvoriti matricu s funkcijom matrica()Osnovni R potpis prima pet argumenata, a ovdje su prikazana tri najčešće korištena:

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

argumenti:

  • datumSkup elemenata koje će R rasporediti u retke i stupce matrice.
  • uskoBroj redaka.
  • ncolBroj stupaca.
  • uz redLogička zastavica. S zadanim byrow = FALSE matrica se popunjava stupac po stupac, od vrha prema dnu. S byrow = TRUE popunjava se redak po redak, slijeva nadesno.
  • dimnamesNeobavezni popis duljine dva koji sadrži nazive redaka i nazive stupaca.

Prije prvog primjera vrijedi znati dva detalja iz osnovne R reference. Ako je zadan samo jedan od nrow i ncol, R zaključuje drugi iz duljine podataka. A ako podaci sadrže premalo elemenata za popunjavanje traženog oblika, vrijednosti se recikliraju, a ne odbacuju.

Konstruirajmo dvije matrice 5×2 iz niza brojeva od 1 do 10, jednu s byrow = TRUE i jednu s byrow = FALSE, kako bismo vidjeli razliku.

# 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

Izlaz:

Budući da je korišteno byrow = TRUE, konzola popunjava prvi redak s 1 i 2, drugi redak s 3 i 4 i tako dalje.

Konzolni izlaz matrice_a popunjen red po red s byrow = TRUE

Sada, ispišite dimenziju matrice u R pomoću dim(). Sintaksa za ispis matrice u R pomoću dim() je:

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

Izlaz:

## [1] 5 2

dim() prvo vraća broj redaka, a zatim broj stupaca, potvrđujući oblik 5×2.

Popuni matricu po stupcima s byrow = FALSE

Istih deset brojeva i isti red stvaraju drugačiji raspored nakon promjene smjera popunjavanja. Keeping byrow prema zadanim postavkama šalje vrijednosti u prvi stupac prije početka drugog.

# 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

Izlaz:

Konzolni izlaz matrice_b popunjen stupac po stupac s byrow = FALSE

Opet ispišite dimenziju matrice koristeći dim(). Ispod je sintaksa R dimenzije matrice ispisa:

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

Izlaz:

## [1] 5 2

Oblik se ne mijenja na 5×2, jer byrow mijenja redoslijed popunjavanja, a nikada dimenzije.

bilješkeKorištenje naredbe matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) imat će isti učinak kao gore, budući da R zaključuje da je nrow = 5 iz deset navedenih vrijednosti.

Također možete stvoriti matricu 4×3 pomoću ncol-a. R će stvoriti 3 stupca i popuniti svaki stupac od vrha do dna. Pogledajte primjer

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

Izlaz:

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

Zaglavlja stupaca [,1] do [,3] i oznake redaka [1,] do [4,] su R-ova zadana rezervirana mjesta. Nestaju čim se navedu stvarni nazivi dimenzija, kao što je prikazano kasnije u ovom vodiču.

Primjer:

dim(matrix_c)

Izlaz:

## [1] 4 3

Dodajte stupac u matricu pomoću cbind()

Stupac možete dodati matrici R pomoću naredbe cbind(). cbind() znači povezivanje stupaca i može spojiti onoliko matrica ili stupaca koliko je navedeno. Na primjer, naš prethodni primjer stvorio je matricu 5×2. Spojimo treći stupac i provjeravamo je li dimenzija 5×3.

Primjer:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

Izlaz:

## [1] 5 3

Primjer:

matrix_a1

Izlaz

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

Primjer:

Također možemo istovremeno povezati više stupaca. Sljedeći blok gradi matricu_a2, matricu 4×3 koja sadrži brojeve od 13 do 24, tako da se može spojiti s matricom_c 4×3 kako bi se dobio rezultat 4×6 koji pokriva od 1 do 24.

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

Izlaz:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

Primjer:

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

Izlaz:

## [1] 4 6

BILJEŠKABroj redaka matrica u R-u mora biti jednak da bi cbind() radio. Kada se razlikuju, R ili reciklira kraći ulaz ili izaziva grešku, pa je sigurnija navika prvo provjeriti dim() na oba objekta.

Gdje cbind() spaja stupce, rbind() dodaje retke. Dodajmo jedan redak našoj matrici matrix_c i provjerimo je li dimenzija 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)

Izlaz:

## [1] 5 3

Primijetite da povezivanje imenovanog vektora kao što je dodaj_redak također daje novom retku to ime, što je prvi korak prema označenim matricama koje su objašnjene dalje u tekstu.

Narežite Matrix

Možemo odabrati jedan ili više elemenata iz matrice u R programiranje pomoću uglatih zagrada []. Unutar zagrada, birač retka dolazi prvi, a birač stupca drugi, odvojeni zarezom. Tu na scenu stupa rezanje.

Na primjer:

  • matrix_c[1,2] odabire element u prvom retku i drugom stupcu.
  • matrix_c[1:3,2:3] rezultira R matricom slojeva s podacima u retcima 1, 2, 3 i stupcima 2 i 3.
  • matrix_c[,1] odabire sve elemente prvog stupca.
  • matrix_c[1,] odabire sve elemente prvog retka.

Ostavljanje zareza praznom stoga znači svaku vrijednost na toj strani. Jedna posljedica iznenađuje početnike: kada je odabran jedan redak ili stupac, R odbacuje praznu dimenziju i vraća običan vektor. Dodavanjem drop = FALSE, kao u matrix_c[1, , drop = FALSE], rezultat ostaje matrica.

Ovo je rezultat koji dobivate za gore navedene kodove

Rezultati konzole za četiri izraza za rezanje matrice u R-u

Imenujte retke i stupce matrice u R-u

Zadane oznake poput [,1] i [3,] otežavaju čitanje izlaza čim matrica dobije stvarno značenje. Argument dimnames i zamjenske funkcije rownames() i colnames() dodaju tekstualne oznake koje zatim putuju s matricom kroz cbind(), t() i svaku operaciju rezanja.

# 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']
funkcija Čita Kompleti
dimnames(m) Obje dimenzije kao popis od dva vektora dimnames(m) <- popis(retci, stupci)
nazivi_redova(m) Oznake redaka nazivi_redova(m) <- redovi
kolonski nazivi (m) Oznake stupaca nazivi_stupaca(m) <- stupci
dim(m) Redci i stupci kao dva cijela broja dim(m) <- c(nrow, ncol)

Nakon što oznake postoje, sales['north', 'q2'] je puno jasnija od sales[1, 2] i preživljava promjenu redoslijeda redaka. Postavljanje komponente dimnames na NULL ponovno uklanja taj skup oznaka, a matrica pretvorena s as.data.frame() prenosi svoja imena redaka i stupaca izravno u podatkovni okvir.

Distributori Operacije u R-u: Aritmetika, transpozicija i množenje

Aritmetika na matricama je mjesto gdje se pravilo jednog tipa isplati. Bazni R obrađuje cijeli skup bez dodatnog paketa, ali dva operatora je lako pomiješati: * množi element po elementu, dok %*% izvodi pravo množenje matrica i zahtijeva da stupci lijevog operanda odgovaraju retcima desnog.

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)Transponira matricu, tako da element [i, j] postaje [j, i]. Dimenzije se prenose.
  • riješiti(m)Vraća inverz kvadratne, nesingularne matrice, a solve(a, b) rješava linearni sustav.
  • Zbrojevi_redova / Zbrojevi_stupaca / Sredstva_redova / Sredstva_stupacaDokumentirano kao ekvivalent apply() sa sumom ili mean, ali puno brže.
  • primijeni(m, MARGINA, ZABAVA)MARGIN = 1 obilazi retke, a MARGIN = 2 obilazi stupce, za bilo koju funkciju koju navedete.
  • dijagnostika, detalj, unakrsna produkcijaDijagonala, determinanta i brži oblik t(x) %*% y.

Budući da su ove operacije vektorizirane, one zamjenjuju petlje umjesto da se nalaze unutar njih. Sažetak koji bi zahtijevao ugniježđenu for petlju kroz tisuće ćelija postaje jedan poziv colMeans(), što je važno čim podaci rastu.

Matrica vs. okvir podataka vs. niz u R-u

Matrice, okviri podataka i nizovi izgledaju pravokutno u konzoli, ali odgovaraju na različita pitanja. Tablica ih postavlja jednu pored druge.

Svojstvo Distributori Okvir podataka Poredak
Dimenzije Točno 2 Točno 2 Bilo koji broj
Vrste stupaca Jedan tip za cijeli objekt Drugačiji tip po stupcu Jedan tip za cijeli objekt
Izgrađeno sa matrica() podaci.okvir() niz()
Tipična upotreba Numeričko računanje i linearna algebra Mješoviti opservacijski podaci Slojene tablice, kao što su brojevi po godinama
Oznake redaka Neobavezni nazivi dimenzija Nazivi redaka uvijek su prisutni Neobavezni nazivi dimenzija
# 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')

Posegnite za matricom kada je svaka ćelija ista vrsta broja i kada je posao aritmetički. Posegnite za podatkovni okvir kada stupci nose različite tipove, na primjer naziv znaka pored numeričke cijene i faktorPosegnite za popis kada dijelovi imaju različite duljine, a za niz kada treći indeks, poput vremena ili regije, zaista postoji. Konverzija u oba smjera je jeftina s as.matrix() i as.data.frame(), tako da struktura može pratiti zadatak, a ne obrnuto.

Pitanja i odgovori

R reciklira vrijednosti umjesto da ih odbacuje, pa matrix(1:3, nrow = 2, ncol = 3) ponavlja niz. Upozorenje se pojavljuje samo kada duljina nije točan višekratnik broja ćelija, što tiho recikliranje čini lako previdljivom greškom.

Koristite negativni indeks: m[-2, ] izostavlja drugi redak, a m[, -3] izostavlja treći stupac. Nekoliko ih može ići odjednom s m[-c(1, 4), ]. Izvorni objekt ostaje nepromijenjen sve dok ne dodijelite rezultat natrag.

Odabirom jednog retka ili stupca prazna dimenzija se prema zadanim postavkama uklanja. Dodajte drop = FALSE, kao u m[1, , drop = FALSE], da biste zadržali matricu s jednim retkom. To je važno kada se rezultat prenosi funkciji koja očekuje dvije dimenzije.

which(m == vrijednost, arr.ind = TRUE) vraća rezultat s dva stupca koji daje redak i stupac svakog podudaranja. Bez arr.ind odgovor je jedan linearni indeks koji se odbrojava niz stupce, što rijetko želite.

Koristite array(data, dim = c(rows, columns, layers)) ili dodijelite dim(x) izravno vektoru. Rezanje tada uzima jedan indeks po dimenziji, kao što je a[2, 3, 1]. Matrica je jednostavno dvodimenzionalni slučaj niza.

Da. Osnovna R referenca navodi da su rowSums i colMeans ekvivalentni apply() sa sum ili mean, ali puno brži, i oba su bolja od eksplicitne for petlje jer se iteracija događa u kompiliranom kodu, a ne u interpreteru.

Prilagođavanje modela je linearna algebra: značajke tvore matricu, koeficijenti tvore vektor, a predviđanje je jedan %*% produkt. Mnogi stroj za učenje Paketi stoga zahtijevaju numeričku matricu, a ne podatkovni okvir kao ulaz.

Da. GitHub kopilot radi u RStudio 2023.09.0 i novijim verzijama te dovršava kod iz komentara u otvorenoj datoteci. Provjerite njegovu logiku dimenzija u RStudio, jer pogrešan redak i dalje daje valjanu matricu.

Sažmite ovu objavu uz: