R Select(), Filter(), Arrange(), Pipeline con Esempio
La libreria chiamata dplyr contiene verbi preziosi per navigare all'interno del dataset. Attraverso questo tutorial utilizzerai il set di dati dei tempi di viaggio. Il set di dati raccoglie informazioni sul viaggio effettuato da un conducente tra la sua casa e il suo posto di lavoro. Ci sono quattordici variabili nel set di dati, 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 set di dati contiene circa 200 osservazioni e le corse sono avvenute nel frattempo Monday a venerdì.
Prima di tutto, devi:
- caricare il set di dati
- verificare la struttura dei dati.
Una caratteristica utile di dplyr è la funzione scorce(). Questo è un miglioramento rispetto a str(). Possiamo usare look() per vedere la struttura del set di dati e decidere quale manipolazione è necessaria.
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...
È ovvio che la variabile Commenti necessita di ulteriore diagnostica. Le prime osservazioni della variabile Comments sono solo valori mancanti.
sum(df$Comments =="")
Spiegazione del codice
- sum(df$Comments ==””): Somma le osservazioni uguali a “” nella colonna commenti da df
Produzione:
## [1] 181
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.
Filtro()
Il verbo filter() aiuta a mantenere le osservazioni in base a un criterio. Il filter() funziona esattamente come select(), si passa prima il data frame e poi una condizione separata 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)
Spiegazione del codice
- table(): conta il numero di osservazioni per livello. Nota: sono accettate solo variabili a livello di fattore
- table(step_1_df$GoingTo): conta il numero di viaggi verso la destinazione finale.
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 if GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Produzione:
## [1] 100 14
# Select observations if GoingTo == Work select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Produzione:
## [1] 105 14
Criteri multipli
Possiamo filtrare un set di dati con più di un criterio. Ad esempio, è possibile estrarre le osservazioni in cui la destinazione è Casa ed è avvenuta un mercoledì.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Produzione:
## [1] 23 14
23 osservazioni corrispondevano a questo criterio.
Conduttura
La creazione di un dataset richiede numerose operazioni, tra cui:
- importazione
- fusione
- Selezione
- filtraggio
- e così via
La libreria dplyr viene fornita con un operatore pratico, %>%, chiamato the conduttura. La funzionalità pipeline rende la manipolazione 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 conveniente per eseguire molte operazioni, soprattutto in una situazione con molti passaggi. L'ambiente finisce con molti oggetti immagazzinati.
Usiamo invece l'operatore pipeline %>%. Dobbiamo solo definire il data frame utilizzato all'inizio e da esso deriverà tutto il processo.
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 the pipe operator `%`, you don't have instructions to pipe anymore Note: Create a new variable is optional. If not included, the output will be displayed 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
Siamo pronti a creare uno straordinario set di dati con l'operatore del gasdotto.
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
Sommario
Nella tabella seguente riassumi tutte le operazioni apprese durante il tutorial.
Verbo | Obiettivo | Code | Spiegazione |
---|---|---|---|
intravedere | controllare la struttura di un df |
glimpse(df) |
Identico a str() |
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() | Filtra il df in base a una o più condizioni |
filter(df, condition1) |
Una condizione |
filter(df, condition1 |
condizione2) | ||
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 |