Menu

Data frame in R: creare, ispezionare e accedere alle colonne

Il data frame è il foglio di calcolo di R: colonne con nome della stessa lunghezza, ognuna con il proprio tipo. Come crearne uno, esaminarlo con str() e head() e accedere a colonne, righe e celle.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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) e tail(df) stampano le prime e le ultime sei righe: indispensabili quando i dataset reali diventano troppo grandi per stamparli interi. Vedrai head() 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(), poi head(), summary(), nrow()/ncol()/names().
  • df$col, df[["col"]] e df[, "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 su mtcars.

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.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA