Accesso agli Elementi di un Vettore in R

Abbiamo visto come creare vettori in linguaggio R. Adesso è venuto il momento di vedere come accedere a tali elementi.

In R si può accedere sia ad un singolo elemento di un vettore sia ad un sottoinsieme di elementi. Vedremo come fare entrambe le cose.

Inoltre, vedremo come modificare gli elementi di un vettore e come aggiungerne di nuovi.

Accesso ai singoli elementi di un vettore

Per accedere agli elementi di un vettore in R, è possibile utilizzare l'operatore di selezione []. L'operatore di selezione è utilizzato per selezionare un singolo elemento o un sottoinsieme di elementi da un vettore.

Partiamo dal vedere come accedere ad un singolo elemento di un vettore. Ad ogni elemento è associato un indice numerico che rappresenta la sua posizione all'interno del vettore. Gli indici in R partono da 1 e non da 0 come in altri linguaggi di programmazione.

Ad esempio, supponiamo di creare un vettore del genere:

> vettore <- c(10, 20, 30, 40, 50)

Per accedere al primo elemento del vettore, possiamo scrivere:

> vettore[1]
[1] 10

Per accedere al terzo elemento del vettore, possiamo scrivere:

> vettore[3]
[1] 30

Questa operazione di selezionare elementi da un vettore viene chiamata, nel gergo tecnico di R, subsetting.

Quando si utilizza un indice bisogna fare attenzione a non utilizzare un valore superiore alla lunghezza del vettore. Ad esempio, se provassimo ad accedere al sesto elemento del vettore vettore[6], otterremmo uno strano valore:

> vettore[6]
[1] NA

Il valore NA sta per Not Available e indica che l'elemento richiesto non è disponibile nel vettore. Nelle prossime lezioni vedremo nel dettaglio come gestire il valore NA.

Definizione

Accesso ad un elemento di un vettore in R

Per accedere ad un singolo elemento di un vettore in R, è possibile utilizzare l'operatore di selezione []. La sintassi è la seguente:

vettore[indice]

In R gli indici di un vettore partono da 1.

Consiglio

Accesso all'ultimo elemento di un vettore in R

Un modo molto pratico per accedere all'ultimo elemento di un vettore in R è il seguente:

vettore[length(vettore)]

Con questo metodo non serve ricordare la lunghezza del vettore.

L'accesso agli elementi di un vettore può avvenire anche in scrittura. Tornando all'esempio di prima, potremmo modificare il terzo valore del vettore in questo modo:

> vettore[3] <- 35
> vettore
[1] 10 20 35 40 50

In questo caso, abbiamo modificato il terzo elemento del vettore vettore assegnandogli il valore 35.

Definizione

Modifica di un elemento di un vettore in R

L'operatore di selezione [] può essere utilizzato anche per modificare un elemento di un vettore. La sintassi è la seguente:

vettore[indice] <- valore

Aggiunta di elementi ad un vettore

L'operatore di selezione può essere anche sfruttato per aggiungere elementi ad un vettore. Il vettore creato sopra è di 5 elementi. Possiamo aggiungere un sesto elemento in questo modo:

> vettore[6] <- 60
> vettore
[1] 10 20 35 40 50 60

Adesso, se controlliamo la lunghezza del vettore otteniamo il risultato seguente:

> length(vettore)
[1] 6

Bisogna prestare attenzione, però, quando si aggiungono elementi in questo modo. Infatti se provassimo ad aggiungere un elemento ad un indice che è maggiore del numero di elementi più uno, otterremmo un vettore con valori NA:

> vettore[10] <- 100
> vettore
[1] 10 20 35 40 50 60 NA NA NA 100

In questo esempio abbiamo aggiunto un elemento all'indice 10 del vettore. Tuttavia, dal momento che il vettore era composto di soli 6 elementi, R ha dovuto aggiungere 3 valori NA al vettore per poter raggiungere la lunghezza richiesta.

Definizione

Aggiunta di un elemento ad un vettore in R

Per aggiungere un elemento ad un vettore di n elementi in R si può utilizzare l'operatore di selezione [] con un indice maggiore di n. La sintassi è:

vettore[indice] <- valore

dove indice deve essere pari ad n

Consiglio

Come aggiungere un elemento ad un vettore senza conoscerne la lunghezza

Un modo molto pratico che ci permette di aggiungere un elemento ad un vettore senza dover tener traccia del numero di elementi è il seguente:

vettore[length(vettore) + 1] <- valore

Usando questa tecnica siamo sicuri di aggiungere un elemento alla fine del vettore in quanto usando length(vettore) + 1 come indice R calcolerà automaticamente l'indice a cui aggiungere il nuovo elemento.

Analogamente, un'altra tecnica è quella di usare la funzione c vista nella lezione precedente per combinare il vettore con il nuovo elemento:

vettore <- c(vettore, valore)

Sottoinsiemi di un vettore

L'operatore di selezione [] ha il vantaggio di poter essere utilizzato oltre che per selezionare singoli elementi, anche per selezionare sottoinsiemi di un vettore. Per far questo è possiamo passare un vettore di indici. Chiariamo con un esempio.

Supponiamo di avere il vettore che segue:

> vettore <- c(10, 20, 30, 40, 50)

Per selezionare il primo e il terzo elemento del vettore, possiamo scrivere:

> vettore[c(1, 3)]
[1] 10 30

In pratica, anziché passare un unico indice, abbiamo passato un vettore di indici. R ha selezionato gli elementi del vettore corrispondenti agli indici specificati.

Questa sintassi prende il nome di indicizzazione vettoriale ed è una delle caratteristiche più potenti del linguaggio R.

Ad esempio, possiamo utilizzare l'indicizzazione vettoriale anche cambiando l'ordine degli elementi:

> vettore[c(3, 1, 5)]
[1] 30 10 50

In sostanza, abbiamo passato un vettore di indici arbitrario ed il vettore risultante è stato costruito selezionando gli elementi del vettore originale corrispondenti agli indici specificati.

Possiamo sfruttare questa tecnica anche per invertire un vettore. Ad esempio:

> vettore[length(vettore):1]
[1] 50 40 30 20 10

Così, con una semplice operazione, abbiamo invertito l'ordine degli elementi del vettore.

Inoltre gli indici possono essere anche ripetuti. Ad esempio, se volessimo selezionare il primo elemento del vettore due volte ed il terzo elemento quattro volte, potremmo scrivere:

> vettore[c(1, 1, 3, 3, 3, 3)]
[1] 10 10 30 30 30 30
Definizione

Indicizzazione vettoriale in R

L'indicizzazione vettoriale in R permette indicizzare elementi di un vettore specificando un vettore di indici. La sintassi è la seguente:

vettore[vettore_indici]

dove vettore_indici è un vettore di indici.

Il risultato sarà un vettore contenente gli elementi del vettore originale corrispondenti agli indici specificati.

Indici negativi

L'operatore di selezione [] può essere utilizzato anche con indici negativi. In tal caso R restituirà un vettore escludendo gli elementi corrispondenti agli indici specificati.

Ad esempio, se volessimo selezionare tutti gli elementi del vettore vettore tranne il primo, potremmo scrivere:

> vettore[-1]
[1] 20 30 40 50

Analogamente possiamo ottenere un vettore ecludendo, ad esempio, l'ultimo elemento:

> vettore[-length(vettore)]
[1] 10 20 30 40

Indici negativi e indicizzazione vettoriale possono essere combinati per escludere più elementi.

Ad esempio se volessimo escludere il primo e l'ultimo elemento del vettore vettore, potremmo scrivere:

> vettore[c(-1, -length(vettore))]
[1] 20 30 40

Possiamo semplificare la sintassi di sopra negando il vettore di indici. Studieremo meglio la negazione di un vettore nelle prossime lezioni. Tuttavia, per ora, possiamo scrivere:

> vettore[-c(1, length(vettore))]
[1] 20 30 40

In questo modo abbiamo ottenuto lo stesso risultato di sopra negando in un sol colpo il vettore di indici.

Definizione

Indici negativi in R

Usando indici negativi con l'operatore di selezione [] è possibile escludere elementi da un vettore. La sintassi è la seguente:

vettore[-vettore_indici]

dove vettore_indici è un vettore di indici.

Il risultato sarà un vettore contenente gli elementi del vettore originale esclusi gli elementi corrispondenti agli indici specificati.

Nota

Indici negativi e positivi non possono essere combinati

In R non è possibile combinare indici negativi e positivi.

Ad esempio, la seguente espressione restituirà un errore:

> vettore <- c(1, 2, 3, 4)
> vettore[c(-1, 2)]
Error in vettore[c(-1, 2)] : 
  only 0's may be mixed with negative subscripts

In Sintesi

Ricapitolando, in questa lezione abbiamo visto che:

  • In R è possibile accedere ad un singolo elemento di un vettore utilizzando l'operatore di selezione []. Gli indici di un vettore partono da 1.
  • L'operatore di selezione può essere utilizzato anche per modificare un elemento di un vettore e per aggiungere elementi ad un vettore.
  • L'operatore di selezione può essere utilizzato anche per selezionare sottoinsiemi di un vettore specificando un vettore di indici.
  • L'operatore di selezione può essere utilizzato anche con indici negativi per escludere elementi da un vettore.

Nella prossima lezione studieremo un importante concetto di R chiamato vettorizzazione che rappresenta uno dei punti di forza del linguaggio.