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.
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 |

