Uno dei punti di forza di R è la presenza di molte librerie, o “pacchetti” (packages), per lo più scritte da altri utenti, che sono specializzate in alcune operazioni specifiche che richiederebbero molto tempo e capacità di programmazione per essere fatte da zero.
In generale, una libreria è un insieme di funzioni, file di aiuto e file di dati che servono a raggiungere un obiettivo più o meno specifico (ad esempio, fare regressioni con dati di serie temporali, utilizzare tecniche di scaling, ecc.). R offre un sacco di librerie – ad Aprile 2022 la rete CRAN ha più di 19.000 librerie disponibili – molte di queste sono scritte da statistici professionisti e permettono di eseguire tecniche all’avanguardia che in altri contesti richiederebbero molte competenze di programmazione.
Anche se avete appena scaricato R, avete già alcune librerie installate sul vostro computer. Tuttavia, non tutte sono disponibili nella memoria di R in ogni momento. Ci sono diversi motivi perchè sia così: alcune librerie richiedono molta memoria, quindi è meglio “chiamarle” al bisogno. Inoltre, alcune librerie usano funzioni che hanno lo stesso nome di funzioni diverse in librerie diverse (ricordate, le funzioni sono memorizzate come oggetti, e gli oggetti hanno nomi). In questo caso, quando richiamate una funzione, R non saprà a quale vi state riferendo. Quindi, in poche parole, è meglio avere caricate solo le librerie che servono in ogni momento.
Potete vedere quali librerie avete caricato nello spazio di lavoro (workspace) in questo momento:
## [1] "stats" "graphics" "grDevices" "utils" "datasets" "methods"
## [7] "base"
Potete anche vedere tutte le librerie che avete installato nel vostro computer anche se non sono state ancora caricate nel workspace:
RStudio è molto comodo anche per quanto riguarda le librerie: nel quadrante in basso a destra c’è una tab chiamata “Packages” che mostra tutte le librerie installate nel vostro computer, e segna quelle che sono già caricate in memoria in questo momento.
Per caricare una libreria si usa la funzione library()
(o in alternativa require()
). Per installare una libreria si usa la funzione install.packages()
.
Vediamo ora come funzionano le librerie cercandone alcune molto importanti per l’analisi dati.
Gli utenti di Stata e SPSS sono abituati a lavorare sullo stesso database per l’intera sessione. Anche con Excel di solito si fa così (anche se si possono avere diversi database aperti in diversi fogli). Il flusso di lavoro in questi casi consiste nel (1) caricare i dati, e (2) eseguire una serie di operazioni sui dati caricati. In R, il fatto che ogni cosa sia immagazzinata in oggetti ci permette di caricare più di un solo database durante la stessa sessione. Inoltre, R può leggere dati in diversi formati, compresi i formati di Stata, SPSS ed Excel.
Però, per cominciare, ricordiamo i due formati nativi che R utilizza per i dati:
.RData
: con questo formato è possibile salvare singoli oggetti (data frame, vettori, funzioni, ecc.) o anche l’intero workspace (tutti gli oggetti che sono nella memoria di lavoro al momento). Le funzioni per trattare gli oggetti .RData
sono le più semplici: save()
per salvare uno o più oggetti, e load()
per leggerli (notare che gli oggetti saranno salvati con i loro nomi originali, quindi quando caricherete il file avranno già un determinato nome). save.image()
invece è la funzione per salvare l’intero workspace..rds
: questo formato può essere usato solo per salvare singoli oggetti, inclusi naturalmente data frame. È particolarmente utile quando si ha a che fare con dataset molto grandi, perché è un formato compresso (e permette quindi di risparmiare memoria). Le funzioni in questo caso sono saveRDS()
per salvare e readRDS()
per leggere i dati. In questo caso quando leggiamo un dataset dovremo metterlo in un oggetto.foreign
La maggior parte dei dataset tuttavia sono in formati diversi da .rds
o .RData
. Potreste dover lavorare con dati Excel, Stata, SPSS, o altri formati. La buona notizia è che R può leggere tutti questi formati. Una libreria molto comune per leggere un database in un formato “esterno” (ovvero un database salvato in un formato che non è nativo di R) si chiama foreign
. Questa libreria è già preinstallata in R base, quindi se volete usarlo dovrete solo caricarlo.
foreign
include una serie di funzioni per leggere e scrivere file di dati in diversi formati. I più utilizzati sono:
read.dta()
/ write.dta()
: leggere e scrivere dataset in Stataread.spss()
: leggere dati in SPSSwrite.foreign()
: scrivere file in diversi formati, inclusi Stata ed SPSSTuttavia, col tempo foreign
è invecchiato male. Sicuramente ci permette di usare R per caricare dati che sono stati prodotti da SPSS e Stata, due formati molto comuni. Tuttavia, ci sono diversi limiti. Innanzi tutto foreign
non legge il formato Excel, che è oggi uno dei più diffusi (se non il più diffuso in assoluto). Inoltre, richiede di ricordare sempre la funzione giusta per caricare un formato specifico. Questi problemi sono stati risolti da una libreria sviluppata più recentemente.
rio
rio
è una libreria che mette assieme tante diverse funzioni provenienti da diverse librerie che servono per leggere e scrivere dati in diversi formati. A differenza di foreign
va installato a parte.
Notare l’opzione dependencies = TRUE
. Questo significa che R scaricherà e installetà non solo rio
, ma anche tutte le librerie da cui rio
dipende. Ci potrebbe volere un po’ di tempo per eseguire questo comando perchè rio
ha parecchie dipendenze–ma questo è anche il motivo per cui è così facile da usare.
Importante
Alcuni utenti Mac potrebbero avere problemi a installare rio
a causa della dipendenza di rio
dalla libreria data.table
– nello specifico, gli utenti Mac potrebbero non essere in grado di installare data.table
, il che renderà impossibile installare rio
a sua volta. In realtà data.table
è una libreria molto utile per fare gestione dei dati (offre probabilmente le funzioni più veloci per gestire database di grandi dimensioni), e impareremo a usarlo tra qualche giorno.
Tuttavia, data.table
tende a non andare d’accordo con i Mac in alcuni casi per problemi di compilazione Cosa significa “compilazione”? Vedi qui per una buona spiegazione. Per data.table
il compiler incriminato è OpenMP. In caso abbiate questo problema, ci sono due possibili soluzioni, la seconda è più difficile da implementare, la prima funziona ed è più che ragionevole. Tuttavia, allego anche la seconda perché potrebbe tornare utile in futuro.
Installare data.table
dal file binario. Questo funzionerà perché il formato binario non ha bisogno di compilazione (che è esattamente il processo di traduzione del codice sorgente in linguaggio macchina binario).
Installare manualmente il compilatore abilitato a OpenMP. Vedere qui per i dettagli. Questa è una procedura più macchinosa, e potrebbe non funzionare (non ha funzionato per me in passato). Ho scoperto questa soluzione da questa e questa discussione.
Sceglieremo la prima soluzione. Notare che questo problema è emerso in passato solo per gli utenti Mac (R per Windows installa le librerie in binario per impostazione predefinita) e potrebbe essere stato risolto nelle ultime versioni di R per Mac. Per installare un pacchetto in binario dal CRAN è sufficiente aggiungere una opzione alla funzione install.packages()
:
Ora dovreste essere tutti in grado di installare rio
e data.table
.
Con rio
abbiamo fondamentalmente 2 funzioni. Carichiamo i dati in ogni formato supportato con la funzione import()
, e scriviamo i dati nel formato che vogliamo con la funzione export()
. Questo rende rio
molto più comodo di altre librerie che leggono/scrivono solo alcuni tipi di file.
Vediamo come funziona.
Quando leggiamo o scriviamo dati dal nostro hard disk, può essere comodo dire a R in un comando separato di fare tutto in una determinata cartella. Questo ci evita di scrivere l’indirizzo completo del file ogni volta. Possiamo farlo con la funzione setwd()
:
Carichiamo ora il database che usiamo come esempio, che è in formato Excel:
(notare che non è strettamente necessario specificare la directory con setwd()
, si può sempre scrivere l’indirizzo completo direttamente nella call di import()
o export()
)
Possiamo farci una prima idea del dataset usando la funzione head()
, che mostra le prime 6 righe:
## id sex eta eta_gr mip1 mip2 eco_eval area
## 1 1 Femmina 60 55+ la scuola il lavoro -1 Sud
## 2 2 Maschio 62 55+ <NA> <NA> -1 Centro
## 3 3 Femmina 68 55+ poverta,lavoro immigrazione -1 Nord-Est
## 4 4 Maschio 62 55+ il lavoro immigrazione -1 Sud
## 5 5 Femmina 54 35 54 lavoro immigrazione -1 Nord-Ovest
## 6 6 Femmina 71 55+ il lavoro l'immigrazione 0 Nord-Ovest
Questo dataset è un sottoinsieme di variabili dalla versione grezza dei dati di un sondaggio svolto dopo le elezioni del 2018 in Italia per il progetto CSES. Include le seguenti variabili:
id
: codice intervistatosex
: sesso dell’intervistatoeta
: età dell’intervistatoeta_gr
: dell’intervistato, raggruppata in 3 categoriemip1, mip2
: le due risposte alla domanda aperta “Secondo lei, quali sono i due problemi più importanti che l’Italia deve affrontare in questo momento?”eco_eval
: la valutazione di come lo stato dell’economia del paese è cambiato nel corso dell’anno precedente, codificato in 3 classi (1 = è migliorato; 0 = è rimasto uguale; -1 = è peggiorato)area
: l’area geografica di residenzaAnche la funzione export()
è molto semplice da usare. Occorre solo specificare quale oggetto contiene il data frame che vogliamo salvare, e il nome da dare al file che creeremo. rio
capirà il formato dal nome. Per esempio, se vogliamo esportare il dataset cses
nel formato di Stata basta salvare il file in .dta
:
Un’altra funzione molto utile di rio
è convert()
, che permette di convertire un dataset da un formato a un altro (esattamente come fa StatTransfer, ma gratuitamente).
rio
: readxl
e haven
Altre due librerie utili per leggere e scrivere dati in formato Excel e Stata sono, rispettivamente, readxl
e haven
. Entrambe queste librerie sono parte di una collezione di librerie chiamata tidyverse
, un sistema sviluppato dalle stesse persone che hanno creato RStudio, e che useremo molto nelle prossime sessioni.
Installiamo quindi tidyverse
:
La libreria readxl
si occupa del formato Excel.
## # A tibble: 6 x 8
## id sex eta eta_gr mip1 mip2 eco_eval area
## <dbl> <chr> <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 1 Femmina 60 55+ la scuola il lavoro -1 Sud
## 2 2 Maschio 62 55+ NA NA -1 Centro
## 3 3 Femmina 68 55+ poverta,lavoro immigrazione -1 Nord-Est
## 4 4 Maschio 62 55+ il lavoro immigrazione -1 Sud
## 5 5 Femmina 54 35 54 lavoro immigrazione -1 Nord-Ovest
## 6 6 Femmina 71 55+ il lavoro l'immigrazione 0 Nord-Ovest
A differenza di rio
, readxl
carica i dati in un oggetto leggermente diverso. Se chiedete a R di mostrarvi le prime righe del dataset con la funzione head()
, l’output includerà la frase A tibble: 6 x 8
e altre informazioni sul tipo di valori (<dbl>
, <chr>
) sotto ai nomi delle variabili. Questo succede perchè readxl
carica i dati in un oggetto leggermente diverso dal formato “data frame”, un formato chiamato “tibble”. Il formato tibble è quasi identico al data frame, l’unica differenza è che è ottimizzato per essere usato con le funzioni che sono parte del tidyverse
. Vedremo la prossima volta di cosa si tratta.
Per la maggior parte degli usi che se ne possono fare, non c’è alcuna differenza tra i formati tibble e data frame. Inoltre, in caso di necessità, è sempre possibile convertire un tibble in data frame con la funzione as.data.frame()
.
La libreria haven
è utilizzata per leggere e scrivere dati in formato SPSS, Stata e SAS (e quindi per certi versi è un sostituto più sofisticato di foreign
). Le funzioni principali sono:
read_dta()
/ write_dta()
: leggere e scrivere dataset in Stata (sembrano identiche alle funzioni di foreign
ma c’è una differenza: il trattino basso _
invece del punto .
)read_sav()
/ write_sav()
: leggere e scrivere dataset in SPSSread_sas()
/ write_sas()
: leggere e scrivere dataset in SASEsploriamo un po’ i dati. Possiamo usare le funzioni che abbiamo visto nella sessione precedente.
sex
, eta_gr
, eco_eval
, mip1