R Vælg(), Filter(), Arranger(), Pipeline med eksempel

Biblioteket kaldet dplyr indeholder værdifulde verber til at navigere inde i datasættet. Gennem denne tutorial vil du bruge rejsetidsdatasættet. Datasættet indsamler information om en chaufførs tur mellem sit hjem og sin arbejdsplads. Der er fjorten variabler i datasættet, herunder:

  • DayOfWeek: Identificer den ugedag chaufføren bruger sin bil
  • Distance: Rejsens samlede distance
  • MaxSpeed: Rejsens maksimale hastighed
  • TotalTime: Rejsens længde i minutter

Datasættet har omkring 200 observationer i datasættet, og turene fandt sted mellem Monday til fredag.

Først og fremmest skal du:

  • indlæse datasættet
  • kontrollere strukturen af ​​dataene.

En praktisk funktion med dplyr er glimpse()-funktionen. Dette er en forbedring i forhold til str(). Vi kan bruge glimpse() til at se strukturen af ​​datasættet og beslutte, hvilken manipulation der kræves.

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

Output:

## 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 indlysende, at variablen Kommentarer har brug for yderligere diagnosticering. De første observationer af kommentarvariablen mangler kun værdier.

sum(df$Comments =="")

Kode Forklaring

  • sum(df$Comments ==””): Sum observationerne svarer til “” i kolonnekommentarerne fra df

Output:

## [1] 181

Vælg()

Vi begynder med udsagnsordet select(). Vi har ikke nødvendigvis brug for alle variablerne, og en god praksis er kun at vælge de variabler, du finder relevante.

Vi har 181 manglende observationer, næsten 90 procent af datasættet. Hvis du beslutter dig for at udelukke dem, vil du ikke være i stand til at fortsætte analysen.

Den anden mulighed er at droppe variablen Comment med udsagnsordet select().

Vi kan vælge variable på forskellige måder med select(). Bemærk, at det første argument er datasættet.

- `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 bruge den tredje måde til at udelukke variablen Kommentarer.

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

Output:

## [1] 205  14
dim(step_1_df)

Output:

## [1] 205  13

Det originale datasæt har 14 funktioner, mens step_1_df har 13.

Filter()

Filter()-verbet hjælper med at holde observationerne efter et kriterium. Filteret() fungerer præcis som select(), du sender først datarammen og derefter en betingelse adskilt af et komma:

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

Et kriterium

Først og fremmest kan du tælle antallet af observationer inden for hvert niveau af en faktorvariabel.

table(step_1_df$GoingTo)

Kode Forklaring

  • table(): Tæl antallet af observationer efter niveau. Bemærk, kun faktorniveauvariabler accepteres
  • table(step_1_df$GoingTo): Tæl antallet af ture mod den endelige destination.

Output:

## 
##  GSK Home 
##  105  100	

Funktionstabellen() angiver, at 105 ture går til GSK og 100 til Home.

Vi kan filtrere dataene for at returnere et datasæt med 105 observationer og et andet med 100 observationer.

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

Output:

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

Output:

## [1] 105  14

Flere kriterier

Vi kan filtrere et datasæt med mere end ét kriterium. For eksempel kan du udtrække observationerne, hvor destinationen er Hjem og fandt sted på en onsdag.

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

Output:

## [1] 23 14

23 observationer matchede dette kriterium.

Pipeline

Oprettelse af et datasæt kræver en masse operationer, såsom:

  • importere
  • sammenlægning
  • udvælgelse
  • filtrering
  • og så videre

dplyr-biblioteket leveres med en praktisk operatør, %>%, kaldet pipeline. Pipeline-funktionen gør manipulationen ren, hurtig og mindre hurtig til fejl.

Denne operatør er en kode, der udfører trin uden at gemme mellemtrin på harddisken. Hvis du er tilbage til vores eksempel fra oven, kan du vælge variablerne af interesse og filtrere dem. Vi har tre trin:

  • Trin 1: Importer data: Importer gps-dataene
  • Trin 2: Vælg data: Vælg GoingTo og DayOfWeek
  • Trin 3: Filtrer data: Retur kun hjem og onsdag

Vi kan bruge den hårde måde at gø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)

Output:

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

Det er ikke en bekvem måde at udføre mange operationer på, især i en situation med mange trin. Miljøet ender med en masse genstande gemt.

Lad os bruge pipeline-operatøren %>% i stedet. Vi behøver kun at definere den dataramme, der blev brugt i begyndelsen, og hele processen vil flyde fra den.

Grundlæggende 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 oprette din første pipe ved at følge de trin, der er opregnet 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)

Output:

## [1] TRUE

Vi er klar til at skabe et fantastisk datasæt med pipeline-operatøren.

arrangere()

I tidligere vejledning, lærer du, hvordan du sorterer værdierne med funktionen sort(). Biblioteket dplyr har sin sorteringsfunktion. Det fungerer som en charme med rørledningen. Ordet arrangere() kan omarrangere en eller mange rækker, enten stigende (standard) eller faldende.

- `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 afstanden efter destination.

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

Output:

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

Resumé

I tabellen nedenfor opsummerer du alle de operationer, du lærte under selvstudiet.

Udsagnsord Objektiv Kode Forklaring
glimt kontrollere strukturen af ​​en df
glimpse(df)
Identisk med str()
Vælg() Vælg/ekskluder variablerne
select(df, A, B ,C)
Vælg variablerne A, B og C
select(df, A:C)
Vælg alle variabler fra A til C
select(df, -C)
Udelad C
filter() Filtrer DF baseret på en eller flere betingelser
filter(df, condition1)
En betingelse
filter(df, condition1
tilstand 2)
arrangere() Sorter datasættet med en eller flere variabler
arrange(A)
Stigende slags variabel A
arrange(A, B)
Stigende slags variabel A og B
arrange(desc(A), B)
Faldende slags variabel A og stigende slags B
%>% Opret en pipeline mellem hvert trin
step 1 %>% step 2 %>% step 3