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.

  • 🧩 struttura: Una matrice è un vettore con un attributo di dimensione, quindi ogni cella deve condividere un tipo di dati.
  • Creazione: matrix(data, nrow, ncol, byrow) organizza una sequenza e R deduce la dimensione mancante.
  • 🔄 Ordine di riempimento: byrow = FALSE riempie colonna per colonna, mentre byrow = TRUE riempie riga per riga.
  • Crescita: La funzione cbind() aggiunge colonne e la funzione rbind() aggiunge righe, a condizione che la dimensione condivisa corrisponda.
  • Affettare: m[riga, colonna] legge prima le righe e, se il lato vuoto, seleziona tutto ciò che si trova su quel lato.
  • 🏷️ etichette: Le funzioni dimnames, rownames() e colnames() sostituiscono i segnaposto [,1] con nomi leggibili.
  • ➕➖ Aritmetica: L'asterisco moltiplica elemento per elemento, mentre %*% esegue la moltiplicazione di matrici.

Funzione matrice in R Crea Stampa aggiungi colonna e fetta

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.

Disposizione di righe e colonne di una funzione matriciale in R

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.

Output della console della matrice_a riempita riga per riga con byrow = TRUE

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:

Output della console di matrix_b riempito colonna per colonna con byrow = FALSE

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

Risultati della console delle quattro espressioni di slicing di matrice in R

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.

DOMANDE FREQUENTI

R ricicla i valori anziché rifiutarli, quindi matrix(1:3, nrow = 2, ncol = 3) ripete la sequenza. Un avviso appare solo quando la lunghezza non è un multiplo esatto del numero di celle, il che rende il riciclo silenzioso un bug facile da non notare.

Utilizza un indice negativo: m[-2, ] elimina la seconda riga e m[, -3] elimina la terza colonna. È possibile eliminarne più di una contemporaneamente con m[-c(1, 4), ]. L'oggetto originale rimane invariato finché non si riassegna il risultato.

Selezionando una singola riga o colonna, la dimensione vuota viene eliminata per impostazione predefinita. Aggiungere `drop = FALSE`, come in `m[1, , drop = FALSE]`, per mantenere una matrice con una sola riga. Questo è importante quando il risultato viene passato a una funzione che si aspetta due dimensioni.

which(m == value, arr.ind = TRUE) restituisce un risultato a due colonne che indica la riga e la colonna di ogni corrispondenza. Senza arr.ind, la risposta è un singolo indice lineare contato lungo le colonne, che raramente è ciò che si desidera.

Utilizza array(data, dim = c(rows, columns, layers)) oppure assegna dim(x) direttamente a un vettore. Lo slicing richiede quindi un indice per dimensione, ad esempio a[2, 3, 1]. Una matrice è semplicemente il caso bidimensionale di un array.

Sì. La documentazione di riferimento di R afferma che `rowSums` e `colMeans` sono equivalenti a `apply()` con `sum` o `mean`, ma molto più veloci, ed entrambi sono più efficienti di un ciclo `for` esplicito perché l'iterazione avviene nel codice compilato anziché nell'interprete.

L'adattamento del modello è algebra lineare: le caratteristiche formano una matrice, i coefficienti formano un vettore e la previsione è un singolo prodotto %*% machine learning I pacchetti richiedono quindi come input una matrice numerica anziché un data frame.

Sì. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub funziona in RStudio 2023.09.0 e versioni successive e completa il codice dai commenti nel file aperto. Controlla la sua logica dimensionale in RStudio, perché un numero di righe errato produce comunque una matrice valida.

Riassumi questo post con: