Un data frame è una lista di colonne
Un data frame è la tabella di R: righe di osservazioni, colonne di variabili. È il foglio di calcolo di R, e la forma in cui arrivano praticamente tutti i dati reali: una riga per persona, per misurazione, per transazione; una colonna per attributo.
Dal punto di vista strutturale, un data frame è una lista di vettori della stessa lunghezza con un comportamento a righe e colonne aggiunto sopra. Questo fatto da solo spiega la maggior parte delle sue regole: ogni colonna ha un solo tipo (è un vettore), colonne diverse possono avere tipi diversi (è una lista), e tutte le colonne devono avere la stessa lunghezza (questa è la parte "frame").
Ne crei uno passando dei vettori con nome a data.frame():
Testo, numeri e valori logici fianco a fianco: il miscuglio che una matrice non può contenere. In pratica raramente scriverai i dati a mano così; di solito le tabelle arrivano tramite read.csv o da un database. Ma tutto ciò che segue vale allo stesso modo, qualunque sia la provenienza del data frame.
Prendere le misure a un data frame
Non fare mai calcoli su un dataset che non hai guardato. Gli strumenti di ispezione di R sono pochi e vale la pena usarli in automatico:
str()è il primo da eseguire su qualsiasi dato appena caricato: una riga per colonna con il suo tipo e i primi valori. È lì che scopri la colonna di "numeri" che in realtà è stata letta come character per colpa di un singolo valore anomalo.nrow()/ncol()danno le dimensioni;names()elenca i nomi delle colonne.summary()fornisce statistiche per colonna: minimo, mediana, media e massimo per i numeri, conteggi per logici e factor.head(df)etail(df)stampano le prime e le ultime sei righe: indispensabili quando i dataset reali diventano troppo grandi per stamparli interi. Vedraihead()all'opera più sotto su un dataset integrato.
Tre modi per ottenere una colonna
L'accesso alle colonne è l'operazione di tutti i giorni, e R ti offre tre modi per scriverlo:
people$age: la forma quotidiana, breve, leggibile e con l'autocompletamento nella maggior parte degli editor.people[["age"]]: risultato identico, ma il nome può venire da una variabile (col <- "age"; people[[col]]), cosa che$non sa fare. Preferiscila dentro le funzioni.people[, "age"]: stile matrice, con le righe prima della virgola (vuoto = tutte) e le colonne dopo.
Tutti e tre restituiscono la colonna come semplice vettore, pronta per mean(people$age). La quarta forma nel frammento è la trappola: people["age"] con le parentesi quadre singole restituisce un data frame di una colonna, non un vettore. È la stessa distinzione tra [ e [[ che hanno le liste, perché un data frame è una lista. Se una funzione matematica si lamenta che il tuo input non è numerico, controlla le parentesi.
Righe e celle
La notazione [row, column] raggiunge qualsiasi porzione della tabella:
people[2, ] è l'intera seconda riga (come data frame di una riga: le righe restano un frame, perché mescolano tipi). people[2, "name"] è una singola cella. Un vettore di numeri di riga estrae più righe.
L'ultima riga è quella importante: una condizione logica su una colonna seleziona delle righe, qui tutte le persone sopra i 28 anni. Questo schema di maschera sulle righe è la base di tutto il filtraggio dei dati in R, e merita un articolo tutto suo: vedi filtrare e selezionare per la trattazione completa, compresi subset() e i filtri con più condizioni.
Aggiungere e rimuovere colonne
Siccome un data frame è una lista di colonne, le colonne si aggiungono e si tolgono con un semplice assegnamento:
Assegnare a un nome nuovo aggiunge la colonna; il vettore deve corrispondere a nrow() (o avere lunghezza 1, che viene riciclata su ogni riga). La seconda aggiunta mostra la mossa idiomatica: nuove colonne calcolate da quelle esistenti, con operazioni vettoriali sull'intera colonna in un colpo solo. Assegnare NULL elimina del tutto una colonna.
I valori di una colonna si sovrascrivono allo stesso modo: people$age <- people$age + 1 invecchia tutti di un anno.
Dataset integrati e due parole sui tibble
R include dei dataset di esercizio già caricati, così puoi provare tutto quanto sopra senza importare nulla. I due che incontrerai in ogni tutorial sono mtcars (32 auto, 11 variabili numeriche) e iris (150 fiori, 4 misure più un factor con la specie):
Ecco head() che si guadagna il posto: sei righe ti dicono la forma dei dati senza inondare lo schermo. Questi dataset sono il terreno di gioco ideale: quando non sei sicuro di come si comporta una funzione, provala su mtcars prima di usarla sui tuoi dati.
Un termine che incontrerai appena tocchi il tidyverse: il tibble, la versione del data frame secondo il tidyverse. Stesso concetto, comportamento più educato: la stampa mostra solo le prime dieci righe con i tipi delle colonne, e non c'è la corrispondenza parziale dei nomi. Si crea con tibble() o viene restituito dalle funzioni di readr/dplyr:
library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#> name age
#> <chr> <dbl>
#> 1 Rosa 30
#> 2 Ken 41
Tutto ciò che c'è in questo articolo, $, str(), l'aggiunta di colonne, le maschere logiche sulle righe, funziona sui tibble senza modifiche. Un tibble è un data frame con qualche rifinitura in più: impara i data frame e avrai imparato entrambi.
Cosa ti porti a casa
- Un data frame è una lista di colonne della stessa lunghezza: un tipo per colonna, tipi misti nella tabella. È il foglio di calcolo di R.
- Ispeziona prima di calcolare: prima
str(), poihead(),summary(),nrow()/ncol()/names(). df$col,df[["col"]]edf[, "col"]restituiscono tutti una colonna come vettore; con le parentesi singole,df["col"]restituisce un data frame.df[rows, cols]estrae qualsiasi porzione; una maschera logica prima della virgola filtra le righe.- Aggiungi colonne con un assegnamento (spesso calcolate da altre colonne); rimuovile con
NULL; fai pratica sumtcars.
Prossimo passo: i valori mancanti, cioè cosa significa NA, perché si propaga nei calcoli e come gestirlo.
Domande frequenti
Come si crea un data frame in R?
Passa a data.frame() dei vettori con nome e della stessa lunghezza: df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). Ogni vettore diventa una colonna. In pratica la maggior parte dei data frame non si scrive a mano, arriva da read.csv() o da un database, ma la struttura è la stessa.
Come si accede a una colonna di un data frame in R?
In tre modi: df$age (rapido e leggibile), df[["age"]] (stesso risultato, funziona quando il nome della colonna è in una variabile) e df[, "age"] (stile matrice). Tutti e tre restituiscono la colonna come semplice vettore. df["age"] con le parentesi quadre singole restituisce invece un data frame di una colonna, una fonte frequente di confusione.
Cosa mostra str() per un data frame?
Una riga per colonna: il nome, il tipo e i primi valori, più il numero di righe e colonne in cima. È il modo più rapido per vedere se una colonna è stata letta come numerica o come testo, ed è per questo che str() dovrebbe essere la prima cosa da eseguire su qualsiasi dataset appena caricato.
Come si aggiunge una colonna a un data frame in R?
Assegna un valore a un nome che non esiste ancora: df$score <- c(88, 75, 93). Il vettore deve avere lo stesso numero di righe (oppure lunghezza 1, che viene riciclata su tutte le righe). Per rimuovere una colonna assegnale NULL: df$score <- NULL.