Librerie

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:

(.packages())
## [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:

(.packages(all.available = T))

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.

Leggere e scrivere 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:

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.

library(foreign)

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 Stata
  • read.spss(): leggere dati in SPSS
  • write.foreign(): scrivere file in diversi formati, inclusi Stata ed SPSS

Tuttavia, 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.

install.packages("rio", dependencies = T)

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.

  1. 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).

  2. 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():

install.packages("data.table", type = "binary")

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():

setwd("/folder/where/you/keep/the/data")

Carichiamo ora il database che usiamo come esempio, che è in formato Excel:

library(rio)
cses <- import("cses2018small.xlsx")

(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:

head(cses)
##   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 intervistato
  • sex: sesso dell’intervistato
  • eta: età dell’intervistato
  • eta_gr: dell’intervistato, raggruppata in 3 categorie
  • mip1, 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 residenza

Anche 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:

export(cses, "cses2018small.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).

convert("cses2018small.dta", "cses2018small.sav")

Alternative a 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:

install.packages("tidyverse", dependencies = T)

La libreria readxl si occupa del formato Excel.

library(readxl)
cses <- read_excel("cses2018small.xlsx")
head(cses)
## # 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().

cses <- as.data.frame(cses)

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 SPSS
  • read_sas() / write_sas(): leggere e scrivere dataset in SAS

Esercizio

Esploriamo un po’ i dati. Possiamo usare le funzioni che abbiamo visto nella sessione precedente.

  • Come facciamo a vedere i nomi delle variabili nei dati?
  • Come facciamo a vedere quante osservazioni ci sono nel dataset?
  • Come facciamo a sapere il formato (es. numerico, factor, carattere) delle seguenti variabili? sex, eta_gr, eco_eval, mip1
  • Quali sono la media e la mediana dell’età degli intervistati?
  • Quanti maschi e quante femmine ci sono nel dataset? Quali sono le percentuali?