R Velg(), Filter(), Arranger(), Pipeline med eksempel

Biblioteket kalt dplyr inneholder verdifulle verb for å navigere i datasettet. Gjennom denne opplæringen vil du bruke reisetidsdatasettet. Datasettet samler informasjon om en sjåførs reise mellom hjemmet og arbeidsplassen. Det er fjorten variabler i datasettet, inkludert:

  • DayOfWeek: Identifiser ukedagen sjåføren bruker bilen sin
  • Distanse: Den totale avstanden på reisen
  • MaxSpeed: Maksimal hastighet på reisen
  • TotalTime: Lengden i minutter av reisen

Datasettet har rundt 200 observasjoner i datasettet, og turene skjedde mellom Monday til fredag.

Først av alt må du:

  • last inn datasettet
  • sjekk strukturen til dataene.

En praktisk funksjon med dplyr er glimpse()-funksjonen. Dette er en forbedring i forhold til str(). Vi kan bruke glimpse() for å se strukturen til datasettet og bestemme hvilken manipulasjon som kreves.

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

Utgang:

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

Dette er åpenbart at variabelen Kommentarer trenger ytterligere diagnostikk. De første observasjonene av Comments-variabelen mangler bare verdier.

sum(df$Comments =="")

Kode Forklaring

  • sum(df$Comments ==””): Sum observasjonene tilsvarer “” i kolonnekommentarene fra df

Utgang:

## [1] 181

å velge()

Vi begynner med verbet select(). Vi trenger ikke nødvendigvis alle variablene, og en god praksis er å velge bare de variablene du finner relevante.

Vi har 181 manglende observasjoner, nesten 90 prosent av datasettet. Hvis du bestemmer deg for å ekskludere dem, vil du ikke kunne fortsette analysen.

Den andre muligheten er å droppe variabelen Comment med verbet select().

Vi kan velge variabler på forskjellige måter med select(). Merk at det første argumentet er datasettet.

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

Du kan bruke den tredje måten å ekskludere kommentarvariabelen.

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

Utgang:

## [1] 205  14
dim(step_1_df)

Utgang:

## [1] 205  13

Det originale datasettet har 14 funksjoner mens step_1_df har 13.

Filter()

Filter()-verbet hjelper til med å holde observasjonene etter et kriterium. Filteret() fungerer akkurat som select(), du sender først datarammen og deretter en betingelse atskilt med komma:

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

Ett kriterium

Først av alt kan du telle antall observasjoner innenfor hvert nivå av en faktorvariabel.

table(step_1_df$GoingTo)

Kode Forklaring

  • table(): Tell antall observasjoner etter nivå. Merk at kun faktornivåvariabler aksepteres
  • table(step_1_df$GoingTo): Tell antall turer mot den endelige destinasjonen.

Utgang:

## 
##  GSK Home 
##  105  100	

Funksjonstabellen() indikerer at 105 turer går til GSK og 100 til Hjem.

Vi kan filtrere dataene for å returnere ett datasett med 105 observasjoner og et annet med 100 observasjoner.

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

Utgang:

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

Utgang:

## [1] 105  14

Flere kriterier

Vi kan filtrere et datasett med mer enn ett kriterium. Du kan for eksempel trekke ut observasjonene der destinasjonen er Hjem og skjedde på en onsdag.

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

Utgang:

## [1] 23 14

23 observasjoner samsvarte med dette kriteriet.

Rørledning

Opprettelsen av et datasett krever mange operasjoner, for eksempel:

  • importere
  • sammenslåing
  • velge
  • filtrering
  • og så videre

Dplyr-biblioteket kommer med en praktisk operatør, %>%, kalt rørledning. Rørledningsfunksjonen gjør manipulasjonen ren, rask og mindre feilsøkende.

Denne operatøren er en kode som utfører trinn uten å lagre mellomtrinn på harddisken. Hvis du er tilbake til eksemplet ovenfor, kan du velge variablene av interesse og filtrere dem. Vi har tre trinn:

  • Trinn 1: Importer data: Importer gps-dataene
  • Trinn 2: Velg data: Velg GoingTo og DayOfWeek
  • Trinn 3: Filtrer data: Returner kun hjem og onsdag

Vi kan bruke den harde måten å gjøre det på:

# 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)

Utgang:

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

Det er ikke en praktisk måte å utføre mange operasjoner på, spesielt i en situasjon med mange trinn. Miljøet ender opp med mange gjenstander lagret.

La oss bruke rørledningsoperatøren %>% i stedet. Vi trenger bare å definere datarammen som ble brukt i begynnelsen, og hele prosessen vil flyte fra den.

Grunnleggende syntaks for 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.

Du kan lage din første pipe ved å følge trinnene som er oppført ovenfor.

# 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)

Utgang:

## [1] TRUE

Vi er klare til å lage et fantastisk datasett med rørledningsoperatøren.

arrangere()

tidligere opplæring, lærer du hvordan du sorterer verdiene med funksjonen sort(). Biblioteket dplyr har sin sorteringsfunksjon. Det fungerer som en sjarm med rørledningen. Ordet ()-verbet kan omorganisere én eller flere rader, enten stigende (standard) eller synkende.

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

Vi kan sortere avstanden etter destinasjon.

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

Utgang:

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

Oppsummering

I tabellen nedenfor oppsummerer du alle operasjonene du lærte under veiledningen.

Verb Målet Kode Forklaring
glimt sjekk strukturen til en df
glimpse(df)
Identisk med str()
å velge() Velg/ekskluder variablene
select(df, A, B ,C)
Velg variablene A, B og C
select(df, A:C)
Velg alle variabler fra A til C
select(df, -C)
Ekskluder C
filter() Filtrer DF basert på en eller flere betingelser
filter(df, condition1)
En betingelse
filter(df, condition1
tilstand 2)
arrangere() Sorter datasettet med én eller flere variabler
arrange(A)
Stigende type variabel A
arrange(A, B)
Stigende type variabel A og B
arrange(desc(A), B)
Synkende type variabel A og stigende type B
%>% Lag en pipeline mellom hvert trinn
step 1 %>% step 2 %>% step 3