Corso
Quasi ogni progetto di analisi dati in R prevede l’estrazione di righe, colonne o valori specifici da un dataset più grande. In R questo si fa con il subsetting, usando la notazione con parentesi [] per un controllo di indicizzazione di basso livello, la funzione subset() per un filtraggio leggibile basato su condizioni, oppure i verbi di dplyr come filter() e select() per pipeline di dati moderne.
TL;DR
-
Usa la notazione con parentesi
df[rows, cols]per il subsetting basato sulla posizione di righe e colonne -
Usa
$per estrarre una singola colonna come vettore:df$column_name -
Usa
subset(df, condition)per un filtraggio leggibile basato su condizioni nelle sessioni interattive -
Aggiungi
drop = FALSEquando selezioni una singola colonna per mantenere il risultato come data frame -
Per codice di produzione e pipeline di dati, preferisci la notazione con parentesi o
dplyr::filter()rispetto asubset()
Selezionare le righe
Ecco un esempio di subsetting su un data frame chiamato debt.
debt[3:6, ]
name payment
3 Dan 150
4 Rob 50
5 Rob 75
6 Rob 100
La sintassi df[rows, columns] è la base del subsetting in R. Qui, 3:6 seleziona le righe dalla 3 alla 6, e lo spazio vuoto dopo la virgola significa "restituisci tutte le colonne". Il risultato è un data frame più piccolo con la stessa struttura di colonne dell’originale.
Selezionare righe da una colonna specifica
Un comportamento a cui fare attenzione è la semplificazione che avviene quando selezioni una singola colonna. Selezionare le prime tre righe solo della colonna payment semplifica il risultato in un vettore.
debt[1:3, 2]
100 200 150
Qui il 2 si riferisce alla seconda colonna di debt, cioè payment. Poiché abbiamo selezionato una singola colonna, R elimina la struttura del data frame e restituisce un semplice vettore numerico.
Formattazione del dataframe
Per mantenerla come dataframe, aggiungi semplicemente drop = FALSE come mostrato sotto:
debt[1:3, 2, drop = FALSE]
payment
1 100
2 200
3 150
Selezionare una colonna specifica
Puoi anche selezionare una singola colonna con l’operatore $ scrivendo dataframe$column. Nel seguente esempio estraiamo la colonna payment da debt. R restituisce il risultato come vettore anziché come data frame.
debt$payment
100 200 150 50 75 100
Usare la funzione subset()
Quando vuoi creare subset più complessi o basati su una condizione, il passo successivo è usare la funzione subset(). Per esempio, e se volessi esaminare i debiti di una persona chiamata Dan? Potresti usare le parentesi per selezionare i suoi debiti e sommarli, ma non è un modo molto robusto di procedere, soprattutto in presenza di potenziali modifiche al dataset.
# Funziona, ma non è informativo
debt[1:3, ]
subset() su una variabile categoriale
Un modo migliore è usare la funzione subset() per selezionare le righe in cui la colonna name è uguale a Dan. Nota che serve il doppio segno di uguale (==), noto come operatore relazionale.
# Funziona, ma non è informativo né robusto
debt[1:3, ]
# Molto più informativo!
subset(debt, name == "Dan")
name payment
1 Dan 100
2 Dan 200
3 Dan 150
Il risultato contiene solo le tre righe in cui name è uguale a "Dan". Nota che i numeri di riga originali (1, 2, 3) sono conservati, il che ti aiuta a ricondurre i risultati al data frame di origine.
subset() su una variabile numerica
Possiamo fare subset anche su colonne numeriche. Se volessimo vedere le righe in cui i pagamenti sono pari a 100 $, faresti quanto segue:
subset(debt, payment == 100)
name payment
1 Dan 100
6 Rob 100
Due righe soddisfano la condizione: la riga 1 (Dan) e la riga 6 (Rob) hanno entrambe pagamenti esattamente di 100 $. Questo mostra che subset() scansiona ogni riga indipendentemente dal nome, restituendo tutte le corrispondenze.
Accedere e fare subset dei dataframe
E se ti servissero solo i flussi di cassa dell’azienda A? Qui la funzione subset() filtra le righe da un data frame diverso, cash:
subset(cash, company == "A")
company cash_flow year
1 A 1000 1
2 A 4000 3
3 A 550 4
Ricorda:
-
Il primo argomento che passi a
subset()è il nome del tuo dataframe,cash. -
Nota che non dovresti mettere
companytra virgolette! -
==è l’operatore di uguaglianza. Verifica dove due cose sono uguali e restituisce un vettore logico.
Esempio interattivo del metodo subset()
Nel seguente esempio, usiamo subset() per selezionare le righe di cash corrispondenti all’azienda B, poi filtriamo i flussi di cassa in scadenza tra 1 anno.
# Righe relative all’azienda B
subset(cash, company == "B")
# Righe con flussi di cassa in scadenza tra 1 anno
subset(cash, year == 1)
Eseguendo il codice sopra, ottieni il seguente risultato:
company cash_flow year
4 B 1500 1
5 B 1100 2
6 B 750 4
7 B 6000 5
company cash_flow year
1 A 1000 1
4 B 1500 1
Provalo tu stesso nel nostro corso Introduction to R for Finance.
Questo contenuto è tratto dal corso Introduction to R for Finance di Lore Dirick su DataCamp.
Subsetting con dplyr
Il pacchetto tidyverse dplyr offre un’alternativa moderna per fare subset dei data frame. La funzione filter() seleziona le righe e select() sceglie le colonne, entrambe usando una sintassi a pipe che concatena le operazioni.
library(dplyr)
# Filtra le righe in cui name è "Dan"
debt %>% filter(name == "Dan")
# Seleziona solo la colonna payment (rimane un data frame)
debt %>% select(payment)
# Combina: filtra le righe e seleziona le colonne in un’unica pipeline
debt %>%
filter(payment >= 100) %>%
select(name, payment)
A differenza di subset(), le funzioni di dplyr funzionano in modo affidabile all’interno di altre funzioni e gestiscono operazioni raggruppate, join e sintesi nella stessa pipeline. Se stai costruendo workflow di analisi dati anziché eseguire query sporadiche, dplyr è lo strumento standard.
Confronto dei metodi di subsetting
Confrontiamo i diversi metodi di subsetting in R in una tabella:
| Metodo | Sintassi | Ideale per | Note |
|---|---|---|---|
Parentesi [] |
df[rows, cols] |
Controllo di basso livello, programmazione | Funziona su tutti gli oggetti R |
$ |
df$col |
Estrazione rapida di una singola colonna | Restituisce un vettore, non un data frame |
subset() |
subset(df, cond) |
Filtraggio interattivo | Non consigliato all’interno di funzioni |
dplyr::filter() |
df %>% filter(cond) |
Pipeline di dati, codice leggibile | Richiede il pacchetto dplyr |
Considerazioni finali
R ti offre diversi modi per fare subset dei dati: la notazione con parentesi [] per il pieno controllo, subset() per un filtraggio interattivo e leggibile, e dplyr::filter() per le pipeline di dati. Le parentesi funzionano su qualsiasi oggetto R, subset() è chiaro per esplorazioni una tantum e dplyr si adatta bene quando concateni più operazioni.
Per approfondire la manipolazione dei dati in R, ti consiglio il corso Data Manipulation with dplyr o il corso Introduction to the Tidyverse su DataCamp.
Domande frequenti su Subset in R
Qual è la differenza tra subset() e dplyr::filter() in R?
Entrambe le funzioni filtrano le righe in base a condizioni, ma si comportano in modo diverso nei contesti di programmazione. subset() usa una valutazione non standard, che la rende comoda per l’uso interattivo ma inaffidabile all’interno di funzioni definite dall’utente. dplyr::filter() è progettata per funzionare in modo sicuro all’interno delle funzioni e si integra con l’operatore pipe (%>%) per concatenare più passaggi di manipolazione dei dati.
Come faccio a fare subset di più colonne contemporaneamente in R?
Puoi passare un vettore di nomi di colonne o di indici all’interno delle parentesi. Per esempio, df[, c("name", "payment")] seleziona due colonne per nome, mentre df[, c(1, 3)] le seleziona per posizione. Con dplyr, puoi usare select(df, name, payment) o funzioni helper come starts_with() e contains() per trovare colonne in base a un pattern.
Perché selezionando una singola colonna in R ottengo un vettore invece di un data frame?
R semplifica il risultato per impostazione predefinita quando viene selezionata una sola colonna usando la notazione con parentesi. Questo comportamento è controllato dal parametro drop, che di default è TRUE. Per mantenere il risultato come data frame, aggiungi drop = FALSE all’espressione con parentesi, ad esempio df[, 2, drop = FALSE].
Posso fare subset delle righe in base a più condizioni in R?
Sì. Puoi combinare le condizioni usando gli operatori & (AND) e | (OR). Ad esempio, subset(df, name == "Dan" & payment > 100) restituisce le righe in cui il nome è Dan e il pagamento supera 100. Con dplyr, puoi separare le condizioni con virgole all’interno di filter(): df %>% filter(name == "Dan", payment > 100).

