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.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
value2 <- "Hello World" # doppio spazio
value1 == value2 # == è l'operatore uguaglianza, vero se i due oggetti coincidono
## [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:
M <- matrix(1:15, nrow=3, byrow=TRUE)
M1 <- matrix(1:15, nrow=3) # popoliamo la matrice in un altro modo
M
## [,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