here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(tidyr)
8 Utility functions
Introduzione
In questo capitolo, esploreremo le principali funzioni di utilità in R per l’importazione di dati da file esterni e la raccolta di statistiche descrittive, fornendo una panoramica generale sui data frame.
Panoramica del capitolo
- Conoscere e sapere utilizzare le principali funzioni di utilità di R.
- Sapere come importare un data set in R e esportare un data set in un file esterno.
- Usare i percorsi relativi rispetto alla radice del progetto con
here::here()
.
8.1 Importare dati in R con rio::import()
Prima di analizzare i dati, è necessario importarli in R.
8.1.1 Il problema: Tanti Formati, un’Unica Soluzione
Nella ricerca psicologica i dati possono essere forniti in molti formati:
- File Excel (
.xlsx
) da questionari compilati in laboratorio, - CSV (
.csv
) da piattaforme online come Qualtrics, - File SPSS (
.sav
) per confrontare studi precedenti, - Solo testo (
.txt
) da esperimenti comportamentali.
Invece di imparare funzioni diverse, una specifica per ciascun formato, il pacchetto rio offre un solo comando universale per le importazioni.
8.1.2 Come Funziona import()
# Carica il pacchetto (installalo prima con install.packages("rio"))
library(rio)
# Importa un file CSV da una cartella "dati" nel tuo progetto
risposte <- rio::import("dati/questionario.csv")
# Importa un foglio Excel con i tempi di reazione
tempi_reazione <- rio::import("dati/esperimento1.xlsx")
# Importa un file SPSS con dati demografici
dati_demografici <- rio::import("dati/partecipanti.sav")
Perché è utile:
- riconosce automaticamente il formato dal nome del file;
- traduce i dati in un formato R pronto per l’analisi (
data.frame
); - conserva le etichette delle variabili (cruciale per questionari!).
8.1.3 Esportare Dati con rio::export()
Dopo aver pulito i dati, è possibile salvarli in qualsiasi formato usando rio::export()
:
8.2 Utilizzare Percorsi Relativi con here::here()
Quando importiamo i dati da file esterni in R, succede spesso di commettere uno dei tre errori seguenti. Vediamo come eviarli.
-
Percatori sbagliati
File aperti in altri programmi
“Errore: non posso aprire il file” → Chiudi Excel/SPSS e riprova-
Codifica caratteri strani
Se vedi � nei testi, specifica l’encoding:import("dati/testo.txt", encoding = "UTF-8")
8.2.1 Evitare Percorsi Assoluti
Come vedremo meglio nel Capitolo 14, il primo passo di un progetto di analisi dei dati è l’organizzazione dei file in cartelle con una struttura chiara:
tuo_progetto/
├── dati/
│ ├── raw/ # Dati originali
│ └── cleaned/ # Dati elaborati
├── script/
└── rapporti/
Tutti i file e le cartelle devono essere contenuti nella directory del progetto.
Il pacchetto here rende l’importazione dei dati più semplice, evitando problemi dovuti a percorsi assoluti che possono cambiare se si modifica la directory di lavoro o si sposta il progetto.
La funzione here()
crea percorsi relativi a partire dalla radice del progetto (cioè dalla cartella che contiene il file .Rproj
o da dove viene inizializzato il progetto RStudio).
Esempio di utilizzo combinato con rio::import()
:
In questo modo, l’importazione diventa indipendente dalla cartella di lavoro attuale e il codice sarà più facilmente condivisibile e riproducibile.
Vantaggi:
-
Semplicità:
rio::import()
riconosce automaticamente il tipo di file. -
Robustezza:
here::here()
garantisce che il percorso sia sempre corretto, indipendentemente da dove viene eseguito lo script.
Questa combinazione rende le analisi riproducibili e consente di collaborare facilmente con altri ricercatori o studenti.
8.3 Funzioni Principali e Loro Utilizzo
R offre una serie di funzioni per esplorare rapidamente i dati e comprenderne la struttura prima di passare a manipolazioni più avanzate.
Funzione | Descrizione |
---|---|
summary() |
Restituisce statistiche descrittive di base per ogni colonna di un data frame. Per le colonne numeriche, calcola valori come il minimo, massimo, media, mediana, primo e terzo quartile, e il numero di valori mancanti (se presenti). Per le colonne non numeriche, restituisce il tipo di dati (carattere, logico) e il conteggio delle categorie. Esempio: summary(iris) restituisce una sintesi delle colonne del dataset iris . |
str() e glimpse()
|
Forniscono una rappresentazione sintetica delle informazioni di un data frame, come dimensione, nomi delle colonne, tipi di dati e valori iniziali. La funzione str() fa parte della configurazione base di R (pacchetto utils ), mentre glimpse() è inclusa in dplyr (pacchetto tidyverse ). Esempio: str(mtcars) o glimpse(mtcars) . |
head() e tail()
|
Permettono di visualizzare rispettivamente le prime o ultime righe di un data frame. Utile per una rapida ispezione del contenuto. Si può specificare il numero di righe da mostrare (es. head(df, 10) ), altrimenti il valore predefinito è sei righe. Esempio: head(iris) per vedere le prime righe del dataset iris . |
View() e view()
|
Visualizzano un data frame in una finestra grafica tipo foglio di calcolo all’interno di RStudio. La funzione View() è parte della configurazione base di R, mentre view() è un alias fornito da tibble (pacchetto tidyverse ). Utile per piccoli data frame, ma poco pratico per dataset di grandi dimensioni. Esempio: View(iris) apre il dataset iris nel visualizzatore di RStudio. |
unique() |
Restituisce i valori unici presenti in una colonna o in un vettore. Esempio: unique(iris$Species) restituisce le specie uniche nel dataset iris . |
names() |
Restituisce i nomi delle colonne di un data frame. Esempio: names(mtcars) restituisce i nomi delle colonne del dataset mtcars . |
class() |
Indica il tipo di dato di un oggetto in R, come numeric , character , logical , o data.frame . Esempio: class(iris) restituisce data.frame . |
length() |
Restituisce il numero di elementi di un oggetto. Per i data frame, restituisce il numero di colonne. Esempio: length(iris) restituisce 5 (colonne). |
nrow() e ncol()
|
Restituiscono rispettivamente il numero di righe e colonne di un data frame. Esempio: nrow(iris) restituisce 150 (righe), mentre ncol(iris) restituisce 5 (colonne). |
8.4 Illustrazione
Immagina di dover analizzare i dati del tuo esperimento sul sonno e la memoria, salvati nel file msleep.csv
. La struttura del tuo progetto RStudio è organizzata così:
mio_esperimento/
├── mio_esperimento.Rproj
├── data/
│ └── msleep.csv
├── script/
│ └── analisi.R
└── output/
La prima cosa da fare è caricare i pacchetti necessari:
A questo punto possiamo importare i dati:
Controlli post-importazione (fondamentali!)
head(msleep)
#> name genus vore order conservation
#> 1 Cheetah Acinonyx carni Carnivora lc
#> 2 Owl monkey Aotus omni Primates
#> 3 Mountain beaver Aplodontia herbi Rodentia nt
#> 4 Greater short-tailed shrew Blarina omni Soricomorpha lc
#> 5 Cow Bos herbi Artiodactyla domesticated
#> 6 Three-toed sloth Bradypus herbi Pilosa
#> sleep_total sleep_rem sleep_cycle awake brainwt bodywt
#> 1 12.1 NA NA 11.9 NA 50.000
#> 2 17.0 1.8 NA 7.0 0.01550 0.480
#> 3 14.4 2.4 NA 9.6 NA 1.350
#> 4 14.9 2.3 0.133 9.1 0.00029 0.019
#> 5 4.0 0.7 0.667 20.0 0.42300 600.000
#> 6 14.4 2.2 0.767 9.6 NA 3.850
str(msleep)
#> 'data.frame': 83 obs. of 11 variables:
#> $ name : chr "Cheetah" "Owl monkey" "Mountain beaver" "Greater short-tailed shrew" ...
#> $ genus : chr "Acinonyx" "Aotus" "Aplodontia" "Blarina" ...
#> $ vore : chr "carni" "omni" "herbi" "omni" ...
#> $ order : chr "Carnivora" "Primates" "Rodentia" "Soricomorpha" ...
#> $ conservation: chr "lc" "" "nt" "lc" ...
#> $ sleep_total : num 12.1 17 14.4 14.9 4 14.4 8.7 7 10.1 3 ...
#> $ sleep_rem : num NA 1.8 2.4 2.3 0.7 2.2 1.4 NA 2.9 NA ...
#> $ sleep_cycle : num NA NA NA 0.133 0.667 ...
#> $ awake : num 11.9 7 9.6 9.1 20 9.6 15.3 17 13.9 21 ...
#> $ brainwt : num NA 0.0155 NA 0.00029 0.423 NA NA NA 0.07 0.0982 ...
#> $ bodywt : num 50 0.48 1.35 0.019 600 ...
glimpse(msleep)
#> Rows: 83
#> Columns: 11
#> $ name <chr> "Cheetah", "Owl monkey", "Mountain beaver", "Greater shor…
#> $ genus <chr> "Acinonyx", "Aotus", "Aplodontia", "Blarina", "Bos", "Bra…
#> $ vore <chr> "carni", "omni", "herbi", "omni", "herbi", "herbi", "carn…
#> $ order <chr> "Carnivora", "Primates", "Rodentia", "Soricomorpha", "Art…
#> $ conservation <chr> "lc", "", "nt", "lc", "domesticated", "", "vu", "", "dome…
#> $ sleep_total <dbl> 12.1, 17.0, 14.4, 14.9, 4.0, 14.4, 8.7, 7.0, 10.1, 3.0, 5…
#> $ sleep_rem <dbl> NA, 1.8, 2.4, 2.3, 0.7, 2.2, 1.4, NA, 2.9, NA, 0.6, 0.8, …
#> $ sleep_cycle <dbl> NA, NA, NA, 0.133, 0.667, 0.767, 0.383, NA, 0.333, NA, NA…
#> $ awake <dbl> 11.9, 7.0, 9.6, 9.1, 20.0, 9.6, 15.3, 17.0, 13.9, 21.0, 1…
#> $ brainwt <dbl> NA, 0.01550, NA, 0.00029, 0.42300, NA, NA, NA, 0.07000, 0…
#> $ bodywt <dbl> 50.000, 0.480, 1.350, 0.019, 600.000, 3.850, 20.490, 0.04…
names(msleep)
#> [1] "name" "genus" "vore" "order" "conservation"
#> [6] "sleep_total" "sleep_rem" "sleep_cycle" "awake" "brainwt"
#> [11] "bodywt"
dim(msleep)
#> [1] 83 11
Errori comuni e soluzioni.
-
“File not found”:
- Verifica che:
- il file sia realmente in
data/
; - il nome del file sia esatto (attenzione a .csv vs .CSV);
- non ci siano spazi nel nome del file.
- il file sia realmente in
- Verifica che:
-
Pacchetti non installati:
# Esegui una volta install.packages("rio") install.packages("here")
-
Progetto non aperto:
- Assicurati di aver aperto il file
.Rproj
prima di iniziare.
- Assicurati di aver aperto il file
Esaminiamo le modalità della variabile qualitativa vore
:
unique(msleep$vore)
#> [1] "carni" "omni" "herbi" "" "insecti"
Se vogliamo la numerosità di ciascuna categoria, possiamo usare table()
:
table(msleep$vore)
#>
#> carni herbi insecti omni
#> 7 19 32 5 20
Si noti che table()
esclude i dati mancanti.
Stampiamo i nomi delle colonne del data frame:
names(msleep)
#> [1] "name" "genus" "vore" "order" "conservation"
#> [6] "sleep_total" "sleep_rem" "sleep_cycle" "awake" "brainwt"
#> [11] "bodywt"
Esaminiamo il tipo di variabile della colonna vore
:
class(msleep$vore)
#> [1] "character"
Le dimensioni del data frame sono date da:
dim(msleep)
#> [1] 83 11
laddove il primo valore è il numero di righe e il secondo valore è il numero di colonne.
Il numero di elementi di un vettore è dato da:
length(msleep$vore)
#> [1] 83
In alternativa, possiamo usare nrow()
nrow(msleep)
#> [1] 83
per il numero di righe e ncol()
ncol(msleep)
#> [1] 11
per il numero di colonne. In maniera equivalente:
dim(msleep)[2]
#> [1] 11