3 Sintassi di base

È importante imparare la sintassi di base del linguaggio di programmazione R, prima di lanciarsi in funzioni più sofisticate, grafici e modelli statistici. Di seguito troverai un’introduzione alla sintassi di base e ai concetti fondamentali di R che ti aiuteranno a capire come funziona questo linguaggio di programmazione.

3.1 Il prompt di R

Il prompt stardard di R è il segno di maggiore-uguale (>)

## [1] 8

3.2 Il prompt di continuazione

Se una linea di comando non è sintatticamente completa, un prompt di continuazione (+) apparirà al posto di quello standard

## [1] 8

3.3 Operatore di assegnazione

L’operatore di assegnazione è una freccia a sinistra (<-), si ottiene digitando due caratteri, il minore < e il meno - e assegna il valore dell’oggetto di destra a quello di sinistra

È anche possibile usare l’uguale come operatore di assegnazione. Tuttavia è preferibile usare la freccia a sinistra, per migliorare la leggibilità del codice e sottolineare l’asimmetria tra quanto viene prima dell’operatore (ossia l’oggetto cui si sta assegnando) e quanto viene dopo (quello che si sta assegnando). Esiste anche l’operatore di assegnazione freccia a destra (->) che assegna il valore dell’oggetto di sinistra all’oggetto di destra.

Il contenuto di un oggetto può essere visualizzato sullo schermo digitando il nome dell’oggetto (in questo caso value) dal prompt di R

## [1] 8

3.4 Ultima espressione

Se dimentichi di salvare la tua ultima espressione, puoi recuperarla attraverso un oggetto interno a R che si chiama .Last.value. Nota il . iniziale nel nome dell’oggetto.

## [1] 8
## [1] "bookdown"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"

3.5 Cancellare un oggetto

Le funzioni rm() oppure remove() sono usate per cancellare un oggetto dall’ambiente di lavoro (workspace)

## Error

Se vuoi cancellare tutti gli oggetti attualmente presenti nell’ambiente di lavoro, puoi usare il comando rm(list = ls()). Quello che stai facendo è passare alla funzione rm (o equivalentemente alla funzione remove) un argomento (list) che contiene l’elenco di tutti gli oggetti da eliminare, in questo caso tutti gli oggetti presenti (catturati dalla funzione ls() che elenca tutti gli oggetti presenti nel workspace).

3.6 Convenzione sui nomi degli oggetti in R

Gli oggetti in R possono avere nomi formati da combinazioni di lettere, numeri, punti (.), sottolineati (_), ma non possono iniziare con un numero e non possono contenere spazi. Inoltre R distingue tra maiuscole e minuscole (case sensitive) quindi

## [1] 8

è diverso da

## Error in try(Value) : object 'Value' not found
## Error : object 'Value' not found

3.7 Trovare gli oggetti

R cerca gli oggetti in una successione di posti definiti nella search path. Questa è una successione di ambienti (environments) che comincia con l’ambiente globale (Global Environment). Puoi ispezionare la search path con la funzione search(), ad esempio sul calcolatore in cui è stato creato questo documento è

##  [1] ".GlobalEnv"        "package:bookdown"  "package:stats"    
##  [4] "package:graphics"  "package:grDevices" "package:utils"    
##  [7] "package:datasets"  "package:methods"   "Autoloads"        
## [10] "package:base"

La funzione attach() consente che copie di oggetti vengano messi nella search path come componenti individuali. Ad esempio, di seguito utilizziamo l’insieme di dati CO2 e successivamente includiamo gli oggetti contenuti in CO2 (che possiamo vedere con la funzione names) nella search path

##  [1] ".GlobalEnv"        "CO2"               "package:bookdown" 
##  [4] "package:stats"     "package:graphics"  "package:grDevices"
##  [7] "package:utils"     "package:datasets"  "package:methods"  
## [10] "Autoloads"         "package:base"
## [1] "CO2"   "value"
## [1] "conc"      "Plant"     "Treatment" "Type"      "uptake"
## [1] "Plant"     "Type"      "Treatment" "conc"      "uptake"
## [1] ".GlobalEnv"       "package:datasets"

La funzione attach() può essere utilizzata solo per liste (list), insiemi di dati (data.frame) e ambienti environment.

La funzione detach() rimuove gli oggetti dalla search path.

3.8 Assegnazione a oggetti

È bene evitare di assegnare a oggetti quei nomi che sono stati riservati a funzioni che costituiscono il linguaggio di R (built-in functions). Se per errore assegni un oggetto o un valore a una funzione predefinita e lo usi come argomento per una ulteriore funzione potresti avere un messaggio di attenzione (warning) ma non sempre… e le cose potrebbero andare in una maniera non attesa. R ha un certo numero di oggetti e funzioni predefinite. Alcuni esempi sono c, TRUE, FALSE, t. Una semplice maniera per evitare di assegnare un valore o un oggetto a una funzione predefinita quando si usa R in maniera interattiva è quello di controllare l’oggetto prima di utilizzarlo. Questo evita inoltre di sovrascrivere oggetti definiti in precedenza.

## [1] TRUE
## function (x) 
## UseMethod("t")
## <bytecode: 0x5630023746b8>
## <environment: namespace:base>

3.9 Spazi

R ignora tutti gli spazi tra oggetti e operatori

tuttavia è bene prestare attenzione ad alcune semplici regole per ottenere un codice più leggibile, come scrivere value <- 2*4 invece di value<-2*4, lasciando uno spazio prima e dopo l’operatore di assegnazione. Non si possono mettere spazi tra due simboli appartenenti allo stesso operatore, per esempio tra < e - per l’operatore di assegnazione

## [1] FALSE

All’interno delle variabili di tipo carattere (stringhe), gli spazi sono considerati caratteri a tutti gli effetti, quindi bisogna fare attenzione al numero di spazi utilizzati

è diverso da

## [1] FALSE

3.10 Tipi di dati

Ci sono diversi tipi di oggetti in R, alcuni dei quali con sottotipi. Vediamo qui i principali, quelli che incontreremo come tipi dei dati che manipoleremo.

  • Numeric
## [1] 605
## [1] TRUE

Il tipo numeric è quello per i numeri (non complessi, come vedremo a breve). Contiene alcuni tipi specializzati: double, quello di default, rappresenta i numeri in virgola mobile a doppia precisione, integer i numeri interi. Di base tutti i numeri per R sono double, ma se vogliamo avere un ulteriore controllo su numeri interi (ad esempio da usare come indici in un vettore) possiamo forzare il tipo integer mediante il comando as.integer La funzione is.numeric controlla se un oggetto è di tipo numeric. Similmente esistono le funzioni is.double e is.integer per controllare se gli oggetti sono double o integer.

## [1] 123
## [1] TRUE
## [1] FALSE
## [1] 123
## [1] TRUE
## [1] FALSE
## [1] TRUE
  • Character
## [1] "Hello World"
## [1] TRUE

Abbiamo già nominato il tipo carattere. Anche qui osserviamo che possiamo forzare R a interpretare un numero come un carattere, mettendolo tra virgolette

## [1] FALSE
## [1] TRUE

Infine osserviamo che possiamo usare anche apostrofi singoli per delimitare una stringa di caratteri

## [1] TRUE
  • Logical
## [1] TRUE
## [1] TRUE

Questo tipo caratterizza le variabili di tipo Booleano, ossia i cui valori possono essere vero o falso.

  • Complex number
## [1] 2+3i
## [1] TRUE

Il tipo per manipolare i numeri complessi (che per R non sono numeri, nel senso che non appartengono a numeric). Tuttavia se operiamo su un numero e su un complesso il risultato (se definito) sarà di tipo complesso.

## [1] TRUE
## [1] FALSE

Ci sono poi altri tipi di oggetti in R (in generale possiamo scoprire il tipo di un oggetto mediante il comando typeof), ma non ce ne interesseremo in questa introduzione.

3.11 Attributi

Tutti gli oggetti di R sono dotati di attributi e questi sono essenziali per la corretta manipolazione di oggetti. Tutti gli oggetti di R hanno due attributi: il modo (mode) e la lunghezza (length). La funzione mode() può essere utilizzata per determinare il modo di un oggetto, ossia il modo in cui l’oggetto viene salvato da R (che corrisponde in linea di massima con il tipo).
La funzione length() può essere utilizzata per determinarne la lunghezza

## [1] "numeric"
## [1] 1
## [1] "character"
## [1] 1
## [1] "logical"
## [1] 1
## [1] "complex"
## [1] 1
## [1] "function"
## [1] 1

L’oggetto NULL (che è predefinito) è un oggetto vuoto che non ha un modo assegnato. La sua lunghezza è zero.

## [1] "NULL"
## [1] 0
## NULL
## [1] 0

3.12 Valori mancanti, indefiniti e infiniti

In casi pratici, alcuni dati non sono conosciuti e devono essere etichettati come valori mancanti (missing value). Il valore predefinito per i valori mancanti in R è NA. Questo significa che il valore non è conosciuto. Ogni operazione su un NA produce come risultato un NA. La funzione is.na() serve a verificare se un certo oggetto, o parte di esso, contiene valori mancanti.

## [1] FALSE FALSE FALSE  TRUE
## [1] TRUE
## [1]  3  6 23
## attr(,"na.action")
## [1] 4
## attr(,"class")
## [1] "omit"

Una cosa cui prestare attenzione quando si manipolano dati italiani, in particolare relativi alle province, è che NA per R è un valore non disponibile e non la provincia di Napoli.

Valori indefiniti, o infiniti (Inf, -Inf and NaN, che significa Not A Number) possono essere controllati con le relative funzioni is.finite(), is.infinite(), e is.nan() allo stesso modo che con i valori mancanti.

Questi valori sono spesso ottenuti dalla divisione per zero o dalla richiesta di calcolare il logaritmo di zero o di un numero negativo.

## [1] Inf
## [1] -Inf
## [1] NaN
## Warning in log(-1): NaNs produced
## [1] NaN

3.13 Operatori aritmetici e logici

Le sezioni precedenti utilizzano alcuni operatori aritmetici e logici nel calcolo delle espressioni. Una lista di questi operatori è riportata nella Tabella che segue.

  • Operatori Aritmetici

|— | Operatore | Descrizione | Esempio |— | + | Addizione | 2+5 | - | Sottrazione | 2-5 | * | Moltiplicazione | 2*5 | / | Divisione | 2/5 | ^ | Elevamento a potebza | 2^5 | %/% | Divisione intera | 5%/%2 | %% | Modulo | 5%%2 |—

Si possono utilizzare le parentesi tonde per regolare la precedenza tra gli operatori

## [1] 49
## [1] 13

inoltre due segni meno consecutivi vengono interpretati nel modo che ci si aspetta

## [1] 1
## [1] 1

Infine, ogni operatore ha una corrispondente funzione, rappresentata dall’operatore tra apici, come nell’esempio seguente

## [1] 5
  • Operatori Logici

|— | Operatore | Descrizione | Esempio |— | == | Uguale | 3==5 | != | Non uguale | 3!=5 | < | Minore di | 3 < 5 | > | Maggiore di | 3 > 5 | <= | Minore o uguale a | 3 <= 5
| >= | Maggiore o uguale a | 3 >= 5
| & | And elemento per elemento | 3==5 & 4!= 5
| | | Or elemento per elemento | 3==5 | 4!= 5
| && | And di controllo | is.na(value) && value==1
| || | Or di controllo | is.na(value) || value==1 | xor | Exclusive Or elemento per elemento | xor(is.na(value1), value2 == 2) | ! | Negazione logica | !is.na(value) |—

La differenza tra & e && (e similmente tra | e ||) sarà più chiara tra poco, quando parleremo di vettori.

Le costanti predefinite TRUE e FALSE sono valori logici e T e F sono funzioni che assumono il valore corrispondente. Anche se hanno una natura diversa possono essere utilizzati in maniera indifferente (così come si possono usare i valori numerici 1 e 0 rispettivamente). Tuttavia suggeriamo di utilizzare la versione estesa.

3.14 Vettori

Passiamo a vedere altri tipi di strutture dati in R: la prima è vector, ovverosia una n-upla ordinata di oggetti dello stesso tipo (ad esempio numeri o caratteri). Per costruire un vettore usiamo il comando c:

## [1] 1 2 3 3 3 4 5 5
## [1] "a" "a" "v" "1" "2"

Nota che in w il '2' finale viene salvato come stringa di caratteri (per mantenere l’uniformità di tipi).

Con una sintassi simile a quella usata per controllare se un oggetto è o meno di un certo tipo, possiamo anche dire se è o meno un vettore o una matrice:

## [1] TRUE
## [1] TRUE
## [1] FALSE

Da quest’ultimo risultato ricaviamo che un vettore non è considerato da R una matrice.

3.15 Matrici

In R una matrice è un vettore di dati disposto in due dimensioni a formare un rettangolo. Come per i vettori, tutti gli oggetti contenuti in una matrice devono essere dello stesso tipo (ad esempio tutti numerici), ma, come abbiamo visto, i vettori in R non sono automaticamente considerati matrici. Vediamo qualche esempio:

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

La lunghezza di una matrice ci dice quanti elementi ha, ma non ci aiuta a scoprire la forma della matrice stessa. Per conoscerne le dimensioni, possiamo usare il comando dim().

## [1] 3 5
## [1] 3 5
## [1] TRUE

La dimensione di una matrice è un vettore di lunghezza 2.

Altre funzioni utili quando si ha a che fare con una matrice sono: nrow e ncol:

## [1] 3
## [1] 5
## NULL
## [1] 3
## [1] 5
## [1] 2
## [1] 1

Osserviamo che nrow ed ncol non operano sui vettori, ma le funzioni NROW e NCOL lo fanno (e nel modo che ci aspettiamo). Questo ci ricorda ancora una volta che R distingue tra maiuscole e minuscole.

3.16 Operazioni con matrici e vettori

Possiamo sommare vettori, purché abbiano la medesima lunghezza oppure uno abbia lunghezza multipla di quella dell’altro, nel qual caso il più breve viene ripetuto (questo prende il nome di recycling). Possiamo moltiplicarli per uno scalare e possiamo moltiplicarli tra loro (sotto le stesse condizioni della somma). Cosa otteniamo in quest’ultimo caso?

##  [1]  1  2  3  4  5  6  7  8  9 10
##  [1] 1 2 1 2 1 2 1 2 1 2
##  [1]  2  4  4  6  6  8  8 10 10 12
##  [1]  2  4  6  8 10 12 14 16 18 20
## Warning in x1 - x3: longer object length is not a multiple of shorter object
## length
##  [1]  4  4  4  4  4  4  4 11 11 11
##  [1]  1  4  3  8  5 12  7 16  9 20

Facendo il prodotto di due vettori quello che abbiamo è il prodotto elemento per elemento.

E per le matrici?

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

Anche per le matrici vale il discorso visto prima che si possono sommare oggetti “più piccoli”, ma la cui lunghezza divida la lunghezza della matrice.

Se moltiplichiamo due matrici, otteniamo il prodotto componente per componente, se vogliamo fare il prodotto di matrici dobbiamo usare %*%:

##      [,1] [,2]
## [1,]    1   12
## [2,]    2   14
## [3,]    3   16
## [4,]    4   18
## [5,]    5   20
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    3    3    3    3    3
## [2,]    6    6    6    6    6
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   13   13   13   13   13
## [2,]   16   16   16   16   16
## [3,]   19   19   19   19   19
## [4,]   22   22   22   22   22
## [5,]   25   25   25   25   25
##      [,1] [,2]
## [1,]   15   40
## [2,]   30   80

Ricordiamo che la moltiplicazione tra matrici si può fare solo se le dimensioni soddisfano certe condizioni e che non è commutativa.

Possiamo anche fare la moltiplicazione matriciale tra una matrice e un vettore (che in questo caso viene considerato come una matrice a una sola colonna). Il risultato è una matrice. Siccome in questo caso si tratta di una matrice colonna, possiamo usare la funzione drop per farla considerare come un vettore a R.

##      [,1]
## [1,]   34
## [2,]   43
## [3,]   52
## [4,]   61
## [5,]   70
## [1] TRUE
## [1] 34 43 52 61 70
## [1] TRUE

3.17 Elementi di un vettore o di una matrice

Come facciamo ad accedere ad un particolare elemento o a un sottoinsieme di elementi di un vettore o di una matrice?

Usiamo l’operatore []. Per i vettori funziona nel modo seguente, passando l’indice (attenzione, gli indici cominciano da 1):

## [1] 0
## [1] 0.000000 3.000000 3.141593

Per le matrici, invece, dobbiamo considerare che hanno più dimensioni, quindi useremo lo stesso operatore, ma con una sintassi leggermente diversa, per accedere a elementi, righe, colonne e sottoinsiemi

##      [,1] [,2] [,3]
## [1,]    2   10   18
## [2,]    6   14   22
## [1] 14
## [1]  2 10 18
## [1] 10 14
## [1] 10 18
##      [,1] [,2]
## [1,]    2   18
## [2,]    6   22

Osserviamo che, quando il risultato della selezione degli elementi poteva essere interpretato come un vettore, R ci ha restituito un vettore (e non una matrice). Se volessimo avere una matrice, dovremmo chiamare l’operatore [] con un ulteriore argomento drop=FALSE:

##      [,1]
## [1,]   10
## [2,]   14

3.18 Altre strutture dati

Che fare qualora volessimo avere un vettore che contenga oggetti di vario tipo (ad esempio un altro vettore) come elementi? Per questo la struttura dati in R è list.

## [[1]]
## [1] "a"
## 
## [[2]]
## [1] 2
## List of 2
##  $ : chr "a"
##  $ : num 2

Il comando str ci dà qualche informazione in più sulla struttura della nostra lista. Notiamo che in questo caso il 2 non è stato forzato a stringa (come nel caso del vettore).

Ma con le liste possiamo fare molto di più!

## List of 3
##  $ lettera: chr "x"
##  $ vettore: num [1:4] 0 3 3.14 -9
##  $ X      : num [1:2, 1:3] 2 6 10 14 18 22
## [1] 3
## $lettera
## [1] "x"
## 
## $vettore
## [1]  0.000000  3.000000  3.141593 -9.000000
## 
## $X
##      [,1] [,2] [,3]
## [1,]    2   10   18
## [2,]    6   14   22

E se vogliamo accedere ad elementi della lista? Possiamo farlo in vari modi:

## $lettera
## [1] "x"
## [1] "x"
##      [,1] [,2] [,3]
## [1,]    2   10   18
## [2,]    6   14   22
##      [,1] [,2] [,3]
## [1,]    2   10   18
## [2,]    6   14   22
## $X
##      [,1] [,2] [,3]
## [1,]    2   10   18
## [2,]    6   14   22

Possiamo accedere per posizione (nella lista), oppure per nome (nel qual caso usiamo una stringa). Notiamo anche la differenza tra [] e [[]]: nel primo caso ci restituisce una (sotto)lista, nel secondo caso ci restituisce l’elemento (che può essere di vari tipi).

Se, in un certo senso, list generalizza i vettori a sequenza di dati non necessariamente dello stesso tipo, c’è un’altra struttura dati che generalizza le matrici a dati non necessariamente dello stesso tipo: data.frame. In questa struttura dati, ogni colonna contiene dati dello stesso tipo, ma colonne differenti possono avere dati di tipo diverso. Ogni colonna ha un nome (e la pensiamo come una variabile) e ogni riga è una lista che pensiamo come un’osservazione di tutte le variabili per un particolare individuo (nel senso statistico).

Possiamo costruire data frame per righe o per colonne, ma per il momento supponiamo che i dati ci vengano forniti già in questo formato (fatto abbastanza comune, come vedremo nel prossimo capitolo) e concentriamoci sulla loro visualizzazione e manipolazione. Per farlo useremo un data.frame che fa parte di R: iris, che raccoglie le misure di lunghezza e larghezza (in cm) di sepali e petali di 150 iris di tre specie: setosa, versicolor e virginica.

Come prima cosa possiamo guardare com’è fatto questo data frame. Ma se lo carichiamo con tutte le sue 150 osservazioni potrebbe essere un po’ difficile da guardare. Per questo possiamo usare la funzione head o la funzione tail per vederne solamente alcune (le prime e le ultime, rispettivamente)

##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1            5.1         3.5          1.4         0.2     setosa
## 2            4.9         3.0          1.4         0.2     setosa
## 3            4.7         3.2          1.3         0.2     setosa
## 4            4.6         3.1          1.5         0.2     setosa
## 5            5.0         3.6          1.4         0.2     setosa
## 6            5.4         3.9          1.7         0.4     setosa
## 7            4.6         3.4          1.4         0.3     setosa
## 8            5.0         3.4          1.5         0.2     setosa
## 9            4.4         2.9          1.4         0.2     setosa
## 10           4.9         3.1          1.5         0.1     setosa
## 11           5.4         3.7          1.5         0.2     setosa
## 12           4.8         3.4          1.6         0.2     setosa
## 13           4.8         3.0          1.4         0.1     setosa
## 14           4.3         3.0          1.1         0.1     setosa
## 15           5.8         4.0          1.2         0.2     setosa
## 16           5.7         4.4          1.5         0.4     setosa
## 17           5.4         3.9          1.3         0.4     setosa
## 18           5.1         3.5          1.4         0.3     setosa
## 19           5.7         3.8          1.7         0.3     setosa
## 20           5.1         3.8          1.5         0.3     setosa
## 21           5.4         3.4          1.7         0.2     setosa
## 22           5.1         3.7          1.5         0.4     setosa
## 23           4.6         3.6          1.0         0.2     setosa
## 24           5.1         3.3          1.7         0.5     setosa
## 25           4.8         3.4          1.9         0.2     setosa
## 26           5.0         3.0          1.6         0.2     setosa
## 27           5.0         3.4          1.6         0.4     setosa
## 28           5.2         3.5          1.5         0.2     setosa
## 29           5.2         3.4          1.4         0.2     setosa
## 30           4.7         3.2          1.6         0.2     setosa
## 31           4.8         3.1          1.6         0.2     setosa
## 32           5.4         3.4          1.5         0.4     setosa
## 33           5.2         4.1          1.5         0.1     setosa
## 34           5.5         4.2          1.4         0.2     setosa
## 35           4.9         3.1          1.5         0.2     setosa
## 36           5.0         3.2          1.2         0.2     setosa
## 37           5.5         3.5          1.3         0.2     setosa
## 38           4.9         3.6          1.4         0.1     setosa
## 39           4.4         3.0          1.3         0.2     setosa
## 40           5.1         3.4          1.5         0.2     setosa
## 41           5.0         3.5          1.3         0.3     setosa
## 42           4.5         2.3          1.3         0.3     setosa
## 43           4.4         3.2          1.3         0.2     setosa
## 44           5.0         3.5          1.6         0.6     setosa
## 45           5.1         3.8          1.9         0.4     setosa
## 46           4.8         3.0          1.4         0.3     setosa
## 47           5.1         3.8          1.6         0.2     setosa
## 48           4.6         3.2          1.4         0.2     setosa
## 49           5.3         3.7          1.5         0.2     setosa
## 50           5.0         3.3          1.4         0.2     setosa
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 54           5.5         2.3          4.0         1.3 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 56           5.7         2.8          4.5         1.3 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 58           4.9         2.4          3.3         1.0 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 60           5.2         2.7          3.9         1.4 versicolor
## 61           5.0         2.0          3.5         1.0 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 65           5.6         2.9          3.6         1.3 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 67           5.6         3.0          4.5         1.5 versicolor
## 68           5.8         2.7          4.1         1.0 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 70           5.6         2.5          3.9         1.1 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 80           5.7         2.6          3.5         1.0 versicolor
## 81           5.5         2.4          3.8         1.1 versicolor
## 82           5.5         2.4          3.7         1.0 versicolor
## 83           5.8         2.7          3.9         1.2 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 85           5.4         3.0          4.5         1.5 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 89           5.6         3.0          4.1         1.3 versicolor
## 90           5.5         2.5          4.0         1.3 versicolor
## 91           5.5         2.6          4.4         1.2 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 93           5.8         2.6          4.0         1.2 versicolor
## 94           5.0         2.3          3.3         1.0 versicolor
## 95           5.6         2.7          4.2         1.3 versicolor
## 96           5.7         3.0          4.2         1.2 versicolor
## 97           5.7         2.9          4.2         1.3 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 99           5.1         2.5          3.0         1.1 versicolor
## 100          5.7         2.8          4.1         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 102          5.8         2.7          5.1         1.9  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica
## 106          7.6         3.0          6.6         2.1  virginica
## 107          4.9         2.5          4.5         1.7  virginica
## 108          7.3         2.9          6.3         1.8  virginica
## 109          6.7         2.5          5.8         1.8  virginica
## 110          7.2         3.6          6.1         2.5  virginica
## 111          6.5         3.2          5.1         2.0  virginica
## 112          6.4         2.7          5.3         1.9  virginica
## 113          6.8         3.0          5.5         2.1  virginica
## 114          5.7         2.5          5.0         2.0  virginica
## 115          5.8         2.8          5.1         2.4  virginica
## 116          6.4         3.2          5.3         2.3  virginica
## 117          6.5         3.0          5.5         1.8  virginica
## 118          7.7         3.8          6.7         2.2  virginica
## 119          7.7         2.6          6.9         2.3  virginica
## 120          6.0         2.2          5.0         1.5  virginica
## 121          6.9         3.2          5.7         2.3  virginica
## 122          5.6         2.8          4.9         2.0  virginica
## 123          7.7         2.8          6.7         2.0  virginica
## 124          6.3         2.7          4.9         1.8  virginica
## 125          6.7         3.3          5.7         2.1  virginica
## 126          7.2         3.2          6.0         1.8  virginica
## 127          6.2         2.8          4.8         1.8  virginica
## 128          6.1         3.0          4.9         1.8  virginica
## 129          6.4         2.8          5.6         2.1  virginica
## 130          7.2         3.0          5.8         1.6  virginica
## 131          7.4         2.8          6.1         1.9  virginica
## 132          7.9         3.8          6.4         2.0  virginica
## 133          6.4         2.8          5.6         2.2  virginica
## 134          6.3         2.8          5.1         1.5  virginica
## 135          6.1         2.6          5.6         1.4  virginica
## 136          7.7         3.0          6.1         2.3  virginica
## 137          6.3         3.4          5.6         2.4  virginica
## 138          6.4         3.1          5.5         1.8  virginica
## 139          6.0         3.0          4.8         1.8  virginica
## 140          6.9         3.1          5.4         2.1  virginica
## 141          6.7         3.1          5.6         2.4  virginica
## 142          6.9         3.1          5.1         2.3  virginica
## 143          5.8         2.7          5.1         1.9  virginica
## 144          6.8         3.2          5.9         2.3  virginica
## 145          6.7         3.3          5.7         2.5  virginica
## 146          6.7         3.0          5.2         2.3  virginica
## 147          6.3         2.5          5.0         1.9  virginica
## 148          6.5         3.0          5.2         2.0  virginica
## 149          6.2         3.4          5.4         2.3  virginica
## 150          5.9         3.0          5.1         1.8  virginica
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

Vediamo che il dataframe ha un’intestazione (header) in cui sono riportati i nomi delle colonne. Possiamo estrarre questi stessi nomi con la funzione colnames, mentre la funzione rownames estrae i nomi associati alle varie osservazioni (i nomi delle righe)

## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
##   [1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"  "12" 
##  [13] "13"  "14"  "15"  "16"  "17"  "18"  "19"  "20"  "21"  "22"  "23"  "24" 
##  [25] "25"  "26"  "27"  "28"  "29"  "30"  "31"  "32"  "33"  "34"  "35"  "36" 
##  [37] "37"  "38"  "39"  "40"  "41"  "42"  "43"  "44"  "45"  "46"  "47"  "48" 
##  [49] "49"  "50"  "51"  "52"  "53"  "54"  "55"  "56"  "57"  "58"  "59"  "60" 
##  [61] "61"  "62"  "63"  "64"  "65"  "66"  "67"  "68"  "69"  "70"  "71"  "72" 
##  [73] "73"  "74"  "75"  "76"  "77"  "78"  "79"  "80"  "81"  "82"  "83"  "84" 
##  [85] "85"  "86"  "87"  "88"  "89"  "90"  "91"  "92"  "93"  "94"  "95"  "96" 
##  [97] "97"  "98"  "99"  "100" "101" "102" "103" "104" "105" "106" "107" "108"
## [109] "109" "110" "111" "112" "113" "114" "115" "116" "117" "118" "119" "120"
## [121] "121" "122" "123" "124" "125" "126" "127" "128" "129" "130" "131" "132"
## [133] "133" "134" "135" "136" "137" "138" "139" "140" "141" "142" "143" "144"
## [145] "145" "146" "147" "148" "149" "150"

Come per le liste, possiamo usare la funzione str per sapere qualcosa in più della struttura del data frame, possiamo poi usare dim per saperne le dimensioni (vedendola come matrice) e in particolare le funzioni nrow e ncol per sapere il numero di righe e di colonne (ossia il numero di osservazioni e il numero di variabili).

Possiamo accedere agli elementi per nome o per posizione, come già visto per le liste:

## [1] setosa
## Levels: setosa versicolor virginica
## [1] 7.7
## [1] 5.1

Potremmo essere interessati ai dati corrispondenti a una specifica osservazione o riga (o più di una). Possiamo estrarli usando la stessa notazione vista sopra (con nome o indice) e lasciando vuota la seconda coordinata, indicando così che ci interessano tutte le colonne (volendo potremmo anche estrarre un sottoinsieme delle variabili)

##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 3          4.7         3.2          1.3         0.2  setosa
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 78          6.7           3            5         1.7 versicolor
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 51          7.0         3.2          4.7         1.4 versicolor
## 99          5.1         2.5          3.0         1.1 versicolor

Possiamo anche estrarre le righe che soddisfano una condizione logica:

##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 9           4.4         2.9          1.4         0.2  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 43          4.4         3.2          1.3         0.2  setosa

Se vogliamo estrarre delle colonne, dobbiamo fare attenzione a quello che ci interessa: se vogliamo avere nuovamente degli oggetti di tipo data.frame (ad esempio per vedere le osservazioni di una certa variabile) possiamo usare il solo nome o indice della colonna tra parentesi quadre

##     Sepal.Width
## 1           3.5
## 2           3.0
## 3           3.2
## 4           3.1
## 5           3.6
## 6           3.9
## 7           3.4
## 8           3.4
## 9           2.9
## 10          3.1
## 11          3.7
## 12          3.4
## 13          3.0
## 14          3.0
## 15          4.0
## 16          4.4
## 17          3.9
## 18          3.5
## 19          3.8
## 20          3.8
## 21          3.4
## 22          3.7
## 23          3.6
## 24          3.3
## 25          3.4
## 26          3.0
## 27          3.4
## 28          3.5
## 29          3.4
## 30          3.2
## 31          3.1
## 32          3.4
## 33          4.1
## 34          4.2
## 35          3.1
## 36          3.2
## 37          3.5
## 38          3.6
## 39          3.0
## 40          3.4
## 41          3.5
## 42          2.3
## 43          3.2
## 44          3.5
## 45          3.8
## 46          3.0
## 47          3.8
## 48          3.2
## 49          3.7
## 50          3.3
## 51          3.2
## 52          3.2
## 53          3.1
## 54          2.3
## 55          2.8
## 56          2.8
## 57          3.3
## 58          2.4
## 59          2.9
## 60          2.7
## 61          2.0
## 62          3.0
## 63          2.2
## 64          2.9
## 65          2.9
## 66          3.1
## 67          3.0
## 68          2.7
## 69          2.2
## 70          2.5
## 71          3.2
## 72          2.8
## 73          2.5
## 74          2.8
## 75          2.9
## 76          3.0
## 77          2.8
## 78          3.0
## 79          2.9
## 80          2.6
## 81          2.4
## 82          2.4
## 83          2.7
## 84          2.7
## 85          3.0
## 86          3.4
## 87          3.1
## 88          2.3
## 89          3.0
## 90          2.5
## 91          2.6
## 92          3.0
## 93          2.6
## 94          2.3
## 95          2.7
## 96          3.0
## 97          2.9
## 98          2.9
## 99          2.5
## 100         2.8
## 101         3.3
## 102         2.7
## 103         3.0
## 104         2.9
## 105         3.0
## 106         3.0
## 107         2.5
## 108         2.9
## 109         2.5
## 110         3.6
## 111         3.2
## 112         2.7
## 113         3.0
## 114         2.5
## 115         2.8
## 116         3.2
## 117         3.0
## 118         3.8
## 119         2.6
## 120         2.2
## 121         3.2
## 122         2.8
## 123         2.8
## 124         2.7
## 125         3.3
## 126         3.2
## 127         2.8
## 128         3.0
## 129         2.8
## 130         3.0
## 131         2.8
## 132         3.8
## 133         2.8
## 134         2.8
## 135         2.6
## 136         3.0
## 137         3.4
## 138         3.1
## 139         3.0
## 140         3.1
## 141         3.1
## 142         3.1
## 143         2.7
## 144         3.2
## 145         3.3
## 146         3.0
## 147         2.5
## 148         3.0
## 149         3.4
## 150         3.0
##     Petal.Length
## 1            1.4
## 2            1.4
## 3            1.3
## 4            1.5
## 5            1.4
## 6            1.7
## 7            1.4
## 8            1.5
## 9            1.4
## 10           1.5
## 11           1.5
## 12           1.6
## 13           1.4
## 14           1.1
## 15           1.2
## 16           1.5
## 17           1.3
## 18           1.4
## 19           1.7
## 20           1.5
## 21           1.7
## 22           1.5
## 23           1.0
## 24           1.7
## 25           1.9
## 26           1.6
## 27           1.6
## 28           1.5
## 29           1.4
## 30           1.6
## 31           1.6
## 32           1.5
## 33           1.5
## 34           1.4
## 35           1.5
## 36           1.2
## 37           1.3
## 38           1.4
## 39           1.3
## 40           1.5
## 41           1.3
## 42           1.3
## 43           1.3
## 44           1.6
## 45           1.9
## 46           1.4
## 47           1.6
## 48           1.4
## 49           1.5
## 50           1.4
## 51           4.7
## 52           4.5
## 53           4.9
## 54           4.0
## 55           4.6
## 56           4.5
## 57           4.7
## 58           3.3
## 59           4.6
## 60           3.9
## 61           3.5
## 62           4.2
## 63           4.0
## 64           4.7
## 65           3.6
## 66           4.4
## 67           4.5
## 68           4.1
## 69           4.5
## 70           3.9
## 71           4.8
## 72           4.0
## 73           4.9
## 74           4.7
## 75           4.3
## 76           4.4
## 77           4.8
## 78           5.0
## 79           4.5
## 80           3.5
## 81           3.8
## 82           3.7
## 83           3.9
## 84           5.1
## 85           4.5
## 86           4.5
## 87           4.7
## 88           4.4
## 89           4.1
## 90           4.0
## 91           4.4
## 92           4.6
## 93           4.0
## 94           3.3
## 95           4.2
## 96           4.2
## 97           4.2
## 98           4.3
## 99           3.0
## 100          4.1
## 101          6.0
## 102          5.1
## 103          5.9
## 104          5.6
## 105          5.8
## 106          6.6
## 107          4.5
## 108          6.3
## 109          5.8
## 110          6.1
## 111          5.1
## 112          5.3
## 113          5.5
## 114          5.0
## 115          5.1
## 116          5.3
## 117          5.5
## 118          6.7
## 119          6.9
## 120          5.0
## 121          5.7
## 122          4.9
## 123          6.7
## 124          4.9
## 125          5.7
## 126          6.0
## 127          4.8
## 128          4.9
## 129          5.6
## 130          5.8
## 131          6.1
## 132          6.4
## 133          5.6
## 134          5.1
## 135          5.6
## 136          6.1
## 137          5.6
## 138          5.5
## 139          4.8
## 140          5.4
## 141          5.6
## 142          5.1
## 143          5.1
## 144          5.9
## 145          5.7
## 146          5.2
## 147          5.0
## 148          5.2
## 149          5.4
## 150          5.1

Se invece ci interessa il vettore delle misure di una variabile, possiamo usare l’operatore [[]] (come già visto per le liste), l’operatore $ oppure il doppio indice, lasciando vuoto il primo:

##   [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 3.5
##  [19] 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2
##  [37] 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3
##  [55] 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7 2.2 2.5 3.2 2.8
##  [73] 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0 3.4 3.1 2.3 3.0 2.5
##  [91] 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9
## [109] 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2
## [127] 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2
## [145] 3.3 3.0 2.5 3.0 3.4 3.0
##   [1] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 0.2 0.2 0.1 0.1 0.2 0.4 0.4 0.3
##  [19] 0.3 0.3 0.2 0.4 0.2 0.5 0.2 0.2 0.4 0.2 0.2 0.2 0.2 0.4 0.1 0.2 0.2 0.2
##  [37] 0.2 0.1 0.2 0.2 0.3 0.3 0.2 0.6 0.4 0.3 0.2 0.2 0.2 0.2 1.4 1.5 1.5 1.3
##  [55] 1.5 1.3 1.6 1.0 1.3 1.4 1.0 1.5 1.0 1.4 1.3 1.4 1.5 1.0 1.5 1.1 1.8 1.3
##  [73] 1.5 1.2 1.3 1.4 1.4 1.7 1.5 1.0 1.1 1.0 1.2 1.6 1.5 1.6 1.5 1.3 1.3 1.3
##  [91] 1.2 1.4 1.2 1.0 1.3 1.2 1.3 1.3 1.1 1.3 2.5 1.9 2.1 1.8 2.2 2.1 1.7 1.8
## [109] 1.8 2.5 2.0 1.9 2.1 2.0 2.4 2.3 1.8 2.2 2.3 1.5 2.3 2.0 2.0 1.8 2.1 1.8
## [127] 1.8 1.8 2.1 1.6 1.9 2.0 2.2 1.5 1.4 2.3 2.4 1.8 1.8 2.1 2.4 2.3 1.9 2.3
## [145] 2.5 2.3 1.9 2.0 2.3 1.8
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Se vogliamo usare la notazione [,] per estrarre un oggetto data.frame dobbiamo dirlo esplicitamente a R, passando il valore drop = FALSE, indicando che non vogliamo lasciar cadere le informazioni

## [1] 0.2
##   Petal.Width
## 2         0.2