Funzione matrice in R: crea, stampa, aggiungi colonna e sezione
⚡ Riepilogo intelligente
In R, una matrice è un array bidimensionale che contiene un singolo tipo di dato su m righe e n colonne, costruito con la funzione matrix(), esteso con cbind() e rbind() e accessibile tramite parentesi quadre.
Funzione matrice in R
Una funzione di matrice in R è un array bidimensionale che ha m numero di righe e n numero di colonne. In altre parole, la matrice nella programmazione R è una combinazione di due o più vettori con lo stesso tipo di dati.
In sostanza, una matrice è semplicemente un vettore che porta un attributo dim di lunghezza due. Ecco perché ogni elemento deve condividere un tipo: nel momento in cui un valore carattere si unisce ai numeri, l'intera matrice viene convertita in carattere. R memorizza i valori in un'unica sequenza per colonne e usa dim per decidere dove termina ogni riga, quindi la scelta di tipo di dati si applica all'intero oggetto contemporaneamente.
Nota: La funzione matrix() restituisce sempre esattamente due dimensioni. Per costruire una struttura con tre o più dimensioni in R, utilizzare array() con un vettore di dimensioni oppure assegnare direttamente dim(). Il diagramma seguente mostra la disposizione di righe e colonne di ogni matrice.
Come creare una matrice in R
Possiamo creare una matrice con la funzione matrice()La firma base di R accetta cinque argomenti, e i tre più utilizzati sono mostrati qui:
matrix(data, nrow, ncol, byrow = FALSE)
Argomenti:
- dati: L'insieme degli elementi che R disporrà nelle righe e nelle colonne della matrice.
- ora: Numero di righe.
- col: Numero di colonne.
- byrow: Un flag logico. Con il valore predefinito byrow = FALSE la matrice viene riempita colonna per colonna, dall'alto verso il basso. Con byrow = TRUE viene riempita riga per riga, da sinistra a destra.
- dimnames: Un elenco facoltativo di lunghezza due che fornisce i nomi delle righe e i nomi delle colonne.
Prima di passare al primo esempio, è utile conoscere due dettagli tratti dalla documentazione di base di R. Se viene specificato solo uno tra nrow e ncol, R deduce l'altro dalla lunghezza dei dati. Inoltre, se i dati contengono troppo pochi elementi per riempire la struttura richiesta, i valori vengono riutilizzati anziché scartati.
Costruiamo due matrici 5×2 a partire dalla sequenza di numeri da 1 a 10, una con byrow = TRUE e una con byrow = FALSE, per osservare la differenza.
# 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
Produzione:
Poiché è stata utilizzata l'opzione byrow = TRUE, la console riempie la prima riga con 1 e 2, la seconda riga con 3 e 4 e così via.
Stampa la dimensione della matrice_a con dim()
Ora stampiamo la dimensione della matrice in R con dim(). La sintassi per stampare la matrice in R usando dim() è:
# Print dimension of the matrix with dim()
dim(matrix_a)
Produzione:
## [1] 5 2
La funzione dim() restituisce prima il numero di righe e poi il numero di colonne, confermando la forma 5×2.
Riempire una matrice per colonna con byrow = FALSE
Gli stessi dieci numeri e lo stesso numero di righe producono una disposizione diversa una volta invertita la direzione di riempimento. Keeping byrow, nella sua impostazione predefinita, invia i valori nella prima colonna prima che inizi la seconda.
# 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
Produzione:
Stampa la dimensione della matrice_b con dim()
Ancora una volta, stampa la dimensione della matrice usando dim(). Di seguito è riportata una sintassi della dimensione della matrice di stampa R:
# Print dimension of the matrix with dim()
dim(matrix_b)
Produzione:
## [1] 5 2
La forma rimane invariata a 5×2, perché byrow modifica l'ordine di riempimento e mai le dimensioni.
Note:: L'utilizzo del comando matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) avrà lo stesso effetto di cui sopra, poiché R deduce nrow = 5 dai dieci valori forniti.
È possibile creare una matrice 4×3 anche utilizzando ncol. R creerà 3 colonne e riempirà ciascuna colonna dall'alto verso il basso. Consulta un esempio.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Produzione:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Le intestazioni di colonna [,1] a [,3] e le etichette di riga [1,] a [4,] sono segnaposto predefiniti di R. Scompaiono non appena vengono forniti i nomi delle dimensioni reali, come mostrato più avanti in questo tutorial.
Esempio:
dim(matrix_c)
Produzione:
## [1] 4 3
Aggiungi una colonna a una matrice con cbind()
È possibile aggiungere colonne a una matrice R con il comando cbind(). cbind() significa "associazione di colonne" e può concatenare un numero di matrici o colonne pari al numero specificato. Ad esempio, nell'esempio precedente è stata creata una matrice 5×2. Ora concateniamo una terza colonna e verifichiamo che la dimensione sia 5×3.
Esempio:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Produzione:
## [1] 5 3
Esempio:
matrix_a1
Uscita
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Esempio:
Possiamo anche collegare più di una colonna alla volta. Il blocco successivo crea matrix_a2, una matrice 4×3 contenente i numeri da 13 a 24, in modo che possa essere unita alla matrice 4×3 matrix_c per produrre un risultato 4×6 che copre i numeri da 1 a 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Produzione:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Esempio:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Produzione:
## [1] 4 6
NOTAIl numero di righe delle matrici in R deve essere uguale affinché la funzione cbind() funzioni. Se differiscono, R riutilizza l'input più corto oppure genera un errore, quindi è più sicuro verificare prima il valore dim() su entrambi gli oggetti.
Mentre cbind() concatena le colonne, rbind() aggiunge le righe. Aggiungiamo una riga alla nostra matrice matrix_c e verifichiamo che la dimensione sia 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)
Produzione:
## [1] 5 3
Si noti che l'associazione di un vettore denominato come add_row assegna anche quel nome alla nuova riga, il che rappresenta il primo passo verso le matrici etichettate che verranno trattate più avanti.
Tagliare una matrice
Possiamo selezionare uno o più elementi da una matrice in Programmazione R utilizzando le parentesi quadre [ ]. All'interno delle parentesi, il selettore di riga viene prima e il selettore di colonna dopo, separati da una virgola. È qui che entra in gioco lo slicing.
Per esempio:
- matrice_c[1,2] seleziona l'elemento nella prima riga e nella seconda colonna.
- matrix_c[1:3,2:3] produce una matrice slice di R con i dati sulle righe 1, 2, 3 e sulle colonne 2 e 3.
- matrice_c[,1] seleziona tutti gli elementi della prima colonna.
- matrice_c[1,] seleziona tutti gli elementi della prima riga.
Lasciando vuoto un lato della virgola, si considerano tutti i valori presenti su quel lato. Una conseguenza che spesso mette in difficoltà i principianti è la seguente: quando si seleziona una singola riga o colonna, R elimina la dimensione vuota e restituisce un semplice vettore. Aggiungendo `drop = FALSE`, come in `matrix_c[1, , drop = FALSE]`, il risultato rimane una matrice.
Ecco l'output che ottieni per i codici sopra
Indicare i nomi delle righe e delle colonne di una matrice in R
Le etichette predefinite come [,1] e [3,] rendono l'output difficile da leggere non appena una matrice assume un significato reale. L'argomento dimnames e le funzioni di sostituzione rownames() e colnames() aggiungono etichette di testo che poi accompagnano la matrice attraverso cbind(), t() e ogni operazione di slicing.
# 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']
| Funzione | Legge | Set |
|---|---|---|
| dimnames(m) | Entrambe le dimensioni come elenco di due vettori | dimnames(m) <- list(rows, cols) |
| nomi_righe(m) | Le etichette di riga | rownames(m) <- righe |
| nomi_colonne(m) | Le etichette delle colonne | colnames(m) <- cols |
| dim(m) | Righe e colonne come due numeri interi | dim(m) <- c(nrow, ncol) |
Una volta che le etichette esistono, sales['north', 'q2'] è molto più chiaro di sales[1, 2] e sopravvive a un riordino delle righe. Impostando un componente dimnames su NULL si rimuove nuovamente quel set di etichette e una matrice convertita con as.data.frame() porta i suoi nomi di riga e colonna direttamente nel Frame dati.
Matrice OperaOperazioni in R: aritmetica, trasposizione e moltiplicazione
L'aritmetica sulle matrici è il campo in cui la regola del tipo singolo si rivela vantaggiosa. R base gestisce l'intero set senza pacchetti aggiuntivi, ma due operatori possono essere facilmente confusi: * moltiplica elemento per elemento, mentre %*% esegue una vera e propria moltiplicazione di matrici e richiede che le colonne dell'operando di sinistra corrispondano alle righe di quello di destra.
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)Traspone la matrice, in modo che l'elemento [i, j] diventi [j, i]. Le dimensioni vengono mantenute.
- risolvere(m): Restituisce l'inversa di una matrice quadrata non singolare, e solve(a, b) risolve un sistema lineare.
- Somme riga / Somme colonna / Medie riga / Medie colonnaÈ documentato come equivalente ad apply() con sum o mean, ma molto più veloce.
- applica(m, MARGINE, DIVERTIMENTO): MARGIN = 1 percorre le righe e MARGIN = 2 percorre le colonne, per qualsiasi funzione tu fornisca.
- diag, det, crossprod: Diagonale, determinante e la forma più veloce di t(x) %*% y.
Poiché queste operazioni sono vettorializzate, sostituiscono i cicli anziché esserne parte integrante. Un riepilogo che richiederebbe un ciclo for annidato su migliaia di celle diventa una singola chiamata a colMeans(), il che diventa rilevante non appena la quantità di dati aumenta.
Matrice vs Data Frame vs Array in R
Matrici, data frame e array appaiono tutti rettangolari nella console, eppure rispondono a domande diverse. La tabella li mette uno accanto all'altro.
| Proprietà | Matrice | Frame di dati | Italia |
|---|---|---|---|
| Dimensioni | Esattamente 2 | Esattamente 2 | Qualsiasi numero |
| Tipi di colonne | Un unico tipo per l'intero oggetto | Un tipo diverso per colonna | Un unico tipo per l'intero oggetto |
| Costruito con | matrice() | data.frame() | array () |
| Utilizzo tipico | Calcolo numerico e algebra lineare | Dati osservazionali misti | Tabelle impilate, come ad esempio i conteggi per anno |
| Etichette di riga | dimname opzionali | I nomi delle righe sono sempre presenti | dimname opzionali |
# 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')
Prendi una matrice quando ogni cella è dello stesso tipo di numero e il lavoro è aritmetico. Prendi una matrice Frame dati quando le colonne contengono tipi diversi, ad esempio un nome di carattere accanto a un prezzo numerico e un fattore. Allunga la mano verso un stratagemma quando le parti hanno lunghezze diverse e per un array quando esiste effettivamente un terzo indice, come ad esempio il tempo o la regione. La conversione in entrambe le direzioni è economica con as.matrix() e as.data.frame(), quindi la struttura può adattarsi al compito anziché il contrario.





