R Välj(), Filter(), Arrangera(), Pipeline med exempel

Biblioteket som heter dplyr innehåller värdefulla verb för att navigera i datamängden. Genom denna handledning kommer du att använda datasetet Restider. Datauppsättningen samlar information om en förares resa mellan sitt hem och sin arbetsplats. Det finns fjorton variabler i datamängden, inklusive:

  • DayOfWeek: Identifiera vilken dag i veckan föraren använder sin bil
  • Distans: Resans totala sträcka
  • MaxSpeed: Resans maximala hastighet
  • TotalTime: Resans längd i minuter

Datauppsättningen har cirka 200 observationer i datamängden, och åkerna skedde mellan Monday till fredag.

Först och främst måste du:

  • ladda datauppsättningen
  • kontrollera strukturen på datan.

En praktisk funktion med dplyr är glimpse()-funktionen. Detta är en förbättring jämfört med str(). Vi kan använda glimpse() för att se strukturen för datamängden och bestämma vilken manipulation som krävs.

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

Produktion:

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

Detta är uppenbart att variabeln Kommentarer behöver ytterligare diagnostik. De första observationerna av variabeln Kommentarer saknar bara värden.

sum(df$Comments =="")

Kodförklaring

  • sum(df$Comments ==””): Summa observationerna är lika med “” i kolumnkommentarerna från df

Produktion:

## [1] 181

Välj()

Vi börjar med verbet select(). Vi behöver inte nödvändigtvis alla variabler, och en god praxis är att bara välja de variabler du tycker är relevanta.

Vi har 181 saknade observationer, nästan 90 procent av datamängden. Om du bestämmer dig för att utesluta dem kommer du inte att kunna fortsätta analysen.

Den andra möjligheten är att släppa variabeln Comment med verbet select().

Vi kan välja variabler på olika sätt med select(). Observera att det första argumentet är datasetet.

- `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 använda det tredje sättet för att utesluta variabeln Kommentarer.

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

Produktion:

## [1] 205  14
dim(step_1_df)

Produktion:

## [1] 205  13

Den ursprungliga datamängden har 14 funktioner medan step_1_df har 13.

Filtrera()

Verbet filter() hjälper till att hålla observationerna efter ett kriterium. Filtret() fungerar precis som select(), du skickar dataramen först och sedan ett villkor separerat med kommatecken:

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

Ett kriterium

Först och främst kan du räkna antalet observationer inom varje nivå av en faktorvariabel.

table(step_1_df$GoingTo)

Kodförklaring

  • table(): Räkna antalet observationer efter nivå. Observera att endast faktornivåvariabler accepteras
  • table(step_1_df$GoingTo): Räkna antalet resor mot slutdestinationen.

Produktion:

## 
##  GSK Home 
##  105  100	

Funktionstabellen() indikerar att 105 åk går till GSK och 100 till Home.

Vi kan filtrera data för att returnera en datauppsättning med 105 observationer och en annan med 100 observationer.

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

Produktion:

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

Produktion:

## [1] 105  14

Flera kriterier

Vi kan filtrera en datauppsättning med mer än ett kriterium. Du kan till exempel extrahera observationerna där destinationen är Hemma och inträffade på en onsdag.

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

Produktion:

## [1] 23 14

23 observationer matchade detta kriterium.

Pipeline

Skapandet av en datauppsättning kräver en hel del operationer, såsom:

  • importera
  • sammanslagning
  • väljer
  • filtrering
  • och så vidare

Dplyr-biblioteket kommer med en praktisk operatör, %>%, kallad rörledning. Pipeline-funktionen gör manipulationen ren, snabb och mindre snabb att göra fel.

Denna operatör är en kod som utför steg utan att spara mellansteg på hårddisken. Om du är tillbaka till vårt exempel från ovan kan du välja variabler av intresse och filtrera dem. Vi har tre steg:

  • Steg 1: Importera data: Importera gps-data
  • Steg 2: Välj data: Välj GoingTo och DayOfWeek
  • Steg 3: Filtrera data: Återvänd endast hem och onsdag

Vi kan använda det hårda sättet att göra det:

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

Produktion:

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

Det är inte ett bekvämt sätt att utföra många operationer, särskilt i en situation med många steg. Miljön slutar med en massa föremål lagrade.

Låt oss använda pipeline-operatören %>% istället. Vi behöver bara definiera dataramen som används i början och hela processen kommer att flöda från den.

Grundläggande syntax för 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 skapa din första pipe genom att följa stegen ovan.

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

Produktion:

## [1] TRUE

Vi är redo att skapa en fantastisk datauppsättning med pipelineoperatören.

ordna()

I tidigare handledning, lär du dig hur du sorterar värdena med funktionen sort(). Biblioteket dplyr har sin sorteringsfunktion. Det fungerar som en smäck med pipeline. Verbet arrange() kan ändra ordningen på en eller flera rader, antingen stigande (standard) eller fallande.

- `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 sortera avståndet efter destination.

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

Produktion:

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

Sammanfattning

I tabellen nedan sammanfattar du alla operationer du lärde dig under handledningen.

Verb Mål Koda Förklaring
glimt kontrollera strukturen för en df
glimpse(df)
Identisk med str()
Välj() Välj/uteslut variablerna
select(df, A, B ,C)
Välj variablerna A, B och C
select(df, A:C)
Välj alla variabler från A till C
select(df, -C)
Uteslut C
filtrera() Filtrera DF baserat på ett eller flera villkor
filter(df, condition1)
Ett villkor
filter(df, condition1
tillstånd 2)
ordna() Sortera datasetet med en eller flera variabler
arrange(A)
Stigande sorts variabel A
arrange(A, B)
Stigande sorts variabel A och B
arrange(desc(A), B)
Fallande sorts variabel A och stigande sorts B
%>% Skapa en pipeline mellan varje steg
step 1 %>% step 2 %>% step 3