R Select(), Filter(), Arrange(), Pipeline con Esempio

⚡ Riepilogo intelligente

In R, Select, Filter e Arrange sono i tre verbi del modulo dplyr che riducono un data frame alle colonne, righe e all'ordine desiderati. Questa guida illustra come combinarli con l'operatore pipe su un dataset di 205 righe relativo ai tempi di percorrenza.

  • 📋 Selezione colonna: select(df, A, B) mantiene le colonne nominate, select(df, A:C) mantiene un intervallo e select(df, -C) ne elimina una.
  • 🔎 Filtro righe: filter(df, condition) mantiene le righe corrispondenti e le condizioni si combinano con la e commerciale per AND o con la barra verticale per OR.
  • 🔣 Ordinamento: La funzione arrange() ordina le righe in ordine crescente per impostazione predefinita, mentre desc() inverte l'ordine di qualsiasi singola colonna.
  • 🔗 Pipe Operare: L'operatore %>% passa ogni risultato direttamente al verbo successivo, quindi nessun oggetto intermedio ingombra l'ambiente.
  • 🧹 Funzioni ausiliarie: Le funzioni starts_with(), contains() e where() selezionano le colonne in base a un modello o a un tipo anziché in base al nome.
  • 📐 L'ordine dei verbi è importante: Filtrare i dati nelle fasi iniziali per ridurne le dimensioni, quindi selezionarli e infine organizzarli, in modo da mantenere più economiche tutte le fasi successive.

R Seleziona Filtro Organizza Pipeline

Cos'è dplyr in R?

dplyr è il pacchetto di manipolazione dei dati del tidyverse. Sostituisce la notazione con parentesi quadre della base R con un piccolo insieme di verbi, ognuno dei quali prende il nome dall'azione che esegue e ognuno dei quali accetta il data frame come primo argomento. Questa struttura coerente è ciò che permette di concatenare i verbi.

Verbo Atti su Ciò che fa
Selezionare() Colonne Mantiene o elimina le variabili
filtro() Righe Mantiene le righe che corrispondono a una condizione
organizzare() Righe Riordina le righe in base a una o più colonne
mutare() Colonne Crea o modifica una variabile
riassumere() Tavolo intero Raggruppa più righe in un'unica statistica
raggruppare per() Tavolo intero Divide i dati in modo che i verbi successivi vengano eseguiti per gruppo

Questo tutorial tratta i primi tre verbi più la pipe. tutorial sulla funzione aggregata Copre in dettaglio le funzioni group_by() e summarise().

Set di dati utilizzato in questo tutorial

La libreria chiamata dplyr contiene verbi utili per navigare all'interno del dataset. In questo tutorial, utilizzerai il dataset "Tempi di viaggio". Il dataset registra i viaggi che un conducente effettua tra casa e luogo di lavoro. Il dataset contiene quattordici variabili, tra cui:

  • DayOfWeek: identifica il giorno della settimana in cui l'autista utilizza la sua auto
  • Distanza: la distanza totale del viaggio
  • MaxSpeed: la velocità massima del viaggio
  • TotalTime: la durata in minuti del viaggio

Il dataset contiene 205 osservazioni e i viaggi hanno avuto luogo da Monday a venerdì.

Prima di tutto, devi:

  • caricare il set di dati
  • verificare la struttura dei dati.

Una comoda funzione di dplyr è glance(). Svolge lo stesso ruolo della funzione str() di R base, ma stampa una riga per ogni variabile, indicandone il tipo e i primi valori, il che rende molto più facile la consultazione di un ampio set di dati.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

Produzione:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

La variabile Commenti necessita chiaramente di un'analisi più approfondita: le prime osservazioni sono tutte vuote.

sum(df$Comments =="")

Code Spiegazione

  • sum(df$Comments == “”): Conta le osservazioni uguali a una stringa vuota nella colonna Comments di df

Produzione:

## [1] 181

Una volta caricati i dati, inizia con il comando che elimina gli spazi vuoti dalle colonne.

Selezionare()

Inizieremo con il verbo select(). Non abbiamo necessariamente bisogno di tutte le variabili e una buona pratica è selezionare solo le variabili che ritieni rilevanti.

Abbiamo 181 osservazioni mancanti, quasi il 90% del set di dati. Se decidi di escluderli non potrai portare avanti l'analisi.

L'altra possibilità è eliminare la variabile Comment con il verbo select().

Possiamo selezionare le variabili in diversi modi con select(). Tieni presente che il primo argomento è il set di dati.

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

Puoi utilizzare il terzo modo per escludere la variabile Commenti.

step_1_df <- select(df, -Comments)
dim(df)

Produzione:

## [1] 205  14
dim(step_1_df)

Produzione:

## [1] 205  13

Il set di dati originale ha 14 funzionalità mentre step_1_df ne ha 13.

Funzioni di supporto select() in R

Assegnare un nome a ogni colonna diventa impraticabile quando un dataset contiene decine di variabili. dplyr include funzioni di supporto che consentono di selezionare le colonne in base a un modello o al tipo.

Aiutante Seleziona le colonne che Esempio
inizia_con() Inizia con una stringa seleziona(df, inizia_con("Avg"))
termina_con() Termina con una stringa seleziona(df, termina_con("Time"))
contiene() Contiene una stringa ovunque seleziona(df, contiene("Velocità"))
corrispondenze() Corrispondenza con un'espressione regolare seleziona(df, corrispondenze("^Max|^Avg"))
Dove() Superare un test di tipo seleziona(df, dove(è.numerico))
qualunque cosa() Non hanno ancora un nome seleziona(df, TempoTotale, tutto())
# Keep only the timing columns
df %>% select(ends_with("Time"))

# Keep every numeric column
df %>% select(where(is.numeric))

# Move TotalTime to the front, keep the rest in place
df %>% select(TotalTime, everything())

Altri due verbi si abbinano naturalmente a select(). Usa rename(new_name = old_name) per rinominare una colonna senza dropping gli altri, e relocate() per spostare le colonne senza elencarle tutte.

filtro()

Il verbo filter() mantiene le osservazioni che soddisfano una condizione. Il filtro() funziona esattamente come select(): prima si passa il dataframe e poi una condizione, il tutto separato da una virgola.

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Un criterio

Prima di tutto, puoi contare il numero di osservazioni all'interno di ciascun livello di una variabile fattore.

table(step_1_df$GoingTo)

Code Spiegazione

  • table(): Conta il numero di osservazioni per livello. Si aspetta una variabile di tipo fattore o carattere.
  • tabella(step_1_df$GoingTo): Conta il numero di viaggi verso ciascuna destinazione

Produzione:

## 
##  GSK Home 
##  105  100	

La funzione table() indica che 105 corse andranno a GSK e 100 a casa.

Possiamo filtrare i dati per restituire un set di dati con 105 osservazioni e un altro con 100 osservazioni.

# Select observations where GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Produzione:

## [1] 100  14
# Select observations where GoingTo == GSK (work)
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Produzione:

## [1] 105  14

criteri di compatibilità

Possiamo filtrare un set di dati con più di un criterio. Ad esempio, puoi estract le osservazioni in cui la destinazione è Casa e il viaggio è avvenuto di mercoledì.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Produzione:

## [1] 23 14

23 osservazioni corrispondevano a questo criterio.

Condizioni comuni del filtro() e Operatori in R

La funzione filter() mantiene tutte le righe per le quali la condizione risulta vera. Le righe che risultano negative (NA) vengono scartate, un comportamento che sorprende la maggior parte dei principianti.

Operator Significato Esempio
== Uguale a filtro(df, GoingTo == “Home”)
!= Non uguale a filtro(df, GiornoDellaSettimana != “Monday")
& E, entrambi devono valere filtro(df, Distanza > 50 e Velocità massima > 130)
| OPPURE, uno dei due può essere valido filtro(df, GiornoDellaSettimana == “Monday” | GiornoDellaSettimana == “Venerdì”)
%In% Corrisponde a qualsiasi valore in un vettore filtro(df, Giorno della settimana %in% c(“Monday", "Venerdì"))
fra() Rientra in un intervallo numerico filtro(df, tra(Distanza, 48, 52))
is.na() Si tratta di un valore mancante filtro(df, is.na(FuelEconomy))

Tre abitudini prevengono la maggior parte dei bug di filter().

  • Utilizzare %in% al posto dell'operatore OR concatenato. filtro(df, Giorno della settimana %in% c(“Monday”, “Friday”)) è più breve e molto più difficile da digitare in modo errato rispetto a due confronti == uniti da una barra verticale.
  • Non verificare mai un valore mancante con ==. L'espressione x == NA restituisce NA, non TRUE, quindi la riga viene ignorata. Utilizzare invece is.na(x).
  • Le virgole significano E. filter(df, a, b) è identico a filter(df, a & b), ed è per questo che l'esempio precedente in questo tutorial funziona in entrambi i casi.

La pipa Operator in dplyr

La creazione di un dataset richiede numerose operazioni, tra cui:

  • importazione
  • fusione
  • selezionando
  • filtraggio
  • e così via

La libreria dplyr viene fornita con un operatore pratico, %>%, chiamato the tuboRende la manipolazione dei dati più pulita, veloce e meno soggetta a errori.

Questo operatore è un codice che esegue passaggi senza salvare i passaggi intermedi sul disco rigido. Se torni al nostro esempio di cui sopra, puoi selezionare le variabili di interesse e filtrarle. Abbiamo tre passaggi:

  • Passaggio 1: importa dati: importa i dati GPS
  • Passaggio 2: selezionare i dati: selezionare GoingTo e DayOfWeek
  • Passaggio 3: filtrare i dati: ritorno solo a casa e mercoledì

Possiamo usare il modo difficile per farlo:

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

Produzione:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Questo non è un modo pratico per concatenare molte operazioni. Ogni risultato intermedio rimane nell'ambiente e i nomi perdono rapidamente di significato.

Utilizza invece l'operatore pipe %>%. Assegni un nome al dataframe una sola volta all'inizio e tutti i passaggi successivi derivano da esso.

Sintassi di base della pipeline

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: the last instruction does not need a trailing `%>%`, because nothing follows it
- Note: assigning the result to a new object is optional. Without it, the output prints in the console.

Puoi creare la tua prima pipa seguendo i passaggi elencati sopra.

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) %>% 

#Step 2
select(GoingTo, DayOfWeek) %>% 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

Produzione:

## [1] TRUE

I due oggetti sono identici, quindi la pipe ha prodotto esattamente lo stesso risultato in un'unica istruzione leggibile.

organizzare()

Nel tutorial precedente, imparerai come ordinare i valori con la funzione sort(). La libreria dplyr ha la sua funzione di ordinamento. Funziona come un incantesimo con la pipeline. Il verbo organizzare() può riordinare una o più righe, sia ascendente (predefinito) che discendente.

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

Possiamo ordinare la distanza per destinazione.

# Sort by destination and distance
step_2_df <- step_1_df %>%
    arrange(GoingTo, Distance)
head(step_2_df)

Produzione:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

Verbi dplyr in R: Guida rapida

La tabella seguente elenca tutti i verbi utilizzati in questo tutorial, con la sintassi e il valore restituito da ciascuna chiamata:

Verbo Obiettivo Code Spiegazione
intravedere controllare la struttura di un df
glimpse(df)
Stesso scopo di str(), più facile da leggere
Selezionare() Seleziona/escludi le variabili
select(df, A, B ,C)
Seleziona le variabili A, B e C
select(df, A:C)
Seleziona tutte le variabili da A a C
select(df, -C)
Escludere C
filtro() Mantieni le righe corrispondenti a una o più condizioni
filter(df, condition1)
Una condizione
filter(df, condition1 & condition2)
Due condizioni combinate con AND
organizzare() Ordina il set di dati con una o più variabili
arrange(A)
Variabile ascendente A
arrange(A, B)
Ordinamento ascendente delle variabili A e B
arrange(desc(A), B)
Ordinamento discendente della variabile A e ordine ascendente di B
%>% Crea una pipeline tra ogni passaggio
step 1 %>% step 2 %>% step 3

DOMANDE FREQUENTI

La pipe %>% di magrittr è inclusa in dplyr e supporta la sintassi segnaposto con un punto. La pipe nativa |> è stata introdotta in R 4.1 e non richiede pacchetti aggiuntivi. Entrambe passano il risultato a sinistra al primo argomento a destra.

No. Ogni verbo dplyr restituisce un nuovo data frame e lascia l'input invariato. Per rendere permanente la modifica, è necessario assegnare il risultato a un oggetto o inoltrarlo tramite pipe.

Un confronto con NA restituisce NA anziché TRUE e filter() mantiene solo le righe che sono TRUE. Usa is.na() per selezionare deliberatamente i valori mancanti oppure drop_na() da tidyr per rimuoverli.

L'ingegneria delle caratteristiche per i modelli di intelligenza artificiale consiste principalmente nel filtrare le righe, selezionare le colonne e ordinare i dati. dplyr esprime questi passaggi come pipeline leggibili che i revisori possono verificare, aspetto fondamentale quando un set di dati di addestramento deve essere riproducibile.

Sì. Gli assistenti IA possono tradurre il sottoinsieme tra parentesi in chiamate select() e filter() e spiegare la pipe. Esegui sempre entrambe le versioni e confronta le dimensioni, perché R base e dplyr gestiscono i valori mancanti in modo diverso.

Riassumi questo post con: