Data Frame in R
I Data Frame sono la struttura dati fondamentale di R per lavorare con dati tabellari. Un data frame è essenzialmente una tabella dove ogni colonna rappresenta una variabile e ogni riga un’osservazione. È la struttura più utilizzata in analisi dei dati, statistica e data science con R.
Creare un Data Frame
Per creare un data frame si usa la funzione data.frame():
# Creare un data frame con dati di studenti
studenti <- data.frame(
nome = c("Marco", "Laura", "Giovanni", "Sara", "Luca"),
eta = c(22, 25, 23, 21, 24),
voto = c(28, 30, 25, 27, 29),
superato = c(TRUE, TRUE, TRUE, TRUE, TRUE)
)
print(studenti)
# nome eta voto superato
# 1 Marco 22 28 TRUE
# 2 Laura 25 30 TRUE
# 3 Giovanni 23 25 TRUE
# 4 Sara 21 27 TRUE
# 5 Luca 24 29 TRUE
Esplorare un Data Frame
R offre diverse funzioni per esplorare la struttura e il contenuto di un data frame:
# Struttura del data frame
str(studenti)
# 'data.frame': 5 obs. of 4 variables:
# $ nome : chr "Marco" "Laura" "Giovanni" "Sara" ...
# $ eta : num 22 25 23 21 24
# $ voto : num 28 30 25 27 29
# $ superato: logi TRUE TRUE TRUE TRUE TRUE
# Riepilogo statistico
summary(studenti)
# nome eta voto superato
# Length:5 Min. :21.0 Min. :25.0 Mode:logical
# Class :character 1st Qu.:22.0 1st Qu.:27.0 TRUE:5
# Mode :character Median :23.0 Median :28.0
# Mean :23.0 Mean :27.8
# 3rd Qu.:24.0 3rd Qu.:29.0
# Max. :25.0 Max. :30.0
# Prime e ultime righe
head(studenti, 3)
# nome eta voto superato
# 1 Marco 22 28 TRUE
# 2 Laura 25 30 TRUE
# 3 Giovanni 23 25 TRUE
tail(studenti, 2)
# nome eta voto superato
# 4 Sara 21 27 TRUE
# 5 Luca 24 29 TRUE
# Dimensioni del data frame
nrow(studenti) # 5 (numero di righe)
ncol(studenti) # 4 (numero di colonne)
dim(studenti) # 5 4
# Nomi delle colonne
names(studenti)
# [1] "nome" "eta" "voto" "superato"
Accedere ai Dati
Esistono diversi modi per accedere ai dati di un data frame:
# Accesso con $ (restituisce un vettore)
studenti$nome
# [1] "Marco" "Laura" "Giovanni" "Sara" "Luca"
# Accesso con [riga, colonna]
studenti[1, 2] # Riga 1, Colonna 2 -> 22
studenti[3, ] # Tutta la riga 3
studenti[, 2] # Tutta la colonna 2 (eta)
# Accesso con [[ ]] (singola colonna come vettore)
studenti[["voto"]]
# [1] 28 30 25 27 29
# Accesso a più righe e colonne
studenti[1:3, c("nome", "voto")]
# nome voto
# 1 Marco 28
# 2 Laura 30
# 3 Giovanni 25
Aggiungere e Modificare Colonne
È semplice aggiungere nuove colonne o modificare quelle esistenti:
# Aggiungere una nuova colonna
studenti$citta <- c("Roma", "Milano", "Napoli", "Torino", "Bologna")
# Aggiungere una colonna calcolata
studenti$voto_normalizzato <- studenti$voto / 30 * 100
print(studenti[, c("nome", "voto", "voto_normalizzato")])
# nome voto voto_normalizzato
# 1 Marco 28 93.33333
# 2 Laura 30 100.00000
# 3 Giovanni 25 83.33333
# 4 Sara 27 90.00000
# 5 Luca 29 96.66667
Filtrare Righe
Il filtraggio delle righe permette di selezionare osservazioni che soddisfano condizioni specifiche:
# Filtrare studenti con voto >= 28
bravi <- studenti[studenti$voto >= 28, ]
print(bravi$nome)
# [1] "Marco" "Laura" "Luca"
# Filtrare con condizioni multiple
risultato <- studenti[studenti$eta > 22 & studenti$voto >= 28, ]
print(risultato)
# nome eta voto superato citta voto_normalizzato
# 2 Laura 25 30 TRUE Milano 100
# 5 Luca 24 29 TRUE Bologna 96.667
# Usare subset() per un filtraggio più leggibile
giovani_bravi <- subset(studenti, eta <= 23 & voto >= 27)
print(giovani_bravi[, c("nome", "eta", "voto")])
# nome eta voto
# 1 Marco 22 28
Unire Data Frame con merge()
La funzione merge() permette di eseguire operazioni di join tra due data frame, in modo simile ai JOIN di SQL:
# Creare un secondo data frame
esami <- data.frame(
nome = c("Marco", "Laura", "Giovanni", "Sara", "Luca"),
materia = c("Statistica", "Algebra", "Analisi", "Fisica", "Informatica")
)
borse <- data.frame(
nome = c("Laura", "Luca", "Elena"),
importo = c(2000, 1500, 1800)
)
# Inner join: solo studenti presenti in entrambi
inner <- merge(studenti, borse, by = "nome")
print(inner[, c("nome", "voto", "importo")])
# nome voto importo
# 1 Laura 30 2000
# 2 Luca 29 1500
# Left join: tutti gli studenti, anche senza borsa
tutti <- merge(studenti, borse, by = "nome", all.x = TRUE)
print(tutti[, c("nome", "voto", "importo")])
# nome voto importo
# 1 Giovanni 25 NA
# 2 Laura 30 2000
# 3 Luca 29 1500
# 4 Marco 28 NA
# 5 Sara 27 NA
Ordinare un Data Frame
Per ordinare un data frame si usa la funzione order():
# Ordinare per voto decrescente
studenti_ord <- studenti[order(studenti$voto, decreasing = TRUE), ]
print(studenti_ord[, c("nome", "voto")])
# nome voto
# 2 Laura 30
# 5 Luca 29
# 1 Marco 28
# 4 Sara 27
# 3 Giovanni 25
Conclusione
I data frame sono la pietra angolare dell’analisi dei dati in R. Padroneggiare la creazione, l’accesso, il filtraggio e l’unione dei data frame è essenziale per qualsiasi progetto di data science. Le funzioni str(), summary(), subset() e merge() sono strumenti quotidiani per ogni programmatore R. Nelle prossime guide approfondiremo la manipolazione avanzata dei dati con pacchetti come dplyr e tidyr.