R เลือก(), กรอง(), จัดเรียง(), ไปป์ไลน์พร้อมตัวอย่าง

ไลบรารีที่เรียกว่า dplyr มีคำกริยาอันมีค่าเพื่อนำทางภายในชุดข้อมูล คุณจะใช้ชุดข้อมูลเวลาเดินทางผ่านบทช่วยสอนนี้ ชุดข้อมูลจะรวบรวมข้อมูลเกี่ยวกับการเดินทางโดยคนขับระหว่างบ้านและที่ทำงานของเขา ชุดข้อมูลมีตัวแปร 14 ตัว ได้แก่:

  • DayOfWeek: ระบุวันในสัปดาห์ที่คนขับใช้รถของเขา
  • ระยะทาง: ระยะทางรวมของการเดินทาง
  • MaxSpeed: ความเร็วสูงสุดของการเดินทาง
  • TotalTime: ความยาวเป็นนาทีของการเดินทาง

ชุดข้อมูลมีการสังเกตประมาณ 200 รายการในชุดข้อมูล และการขี่เกิดขึ้นระหว่างนั้น Monday ถึงวันศุกร์

ก่อนอื่น คุณต้อง:

  • โหลดชุดข้อมูล
  • ตรวจสอบโครงสร้างของข้อมูล

ฟีเจอร์ที่มีประโยชน์อย่างหนึ่งของ dplyr คือฟังก์ชัน glimse() นี่คือการปรับปรุงมากกว่า str() เราสามารถใช้ gimpse() เพื่อดูโครงสร้างของชุดข้อมูลและตัดสินใจว่าจำเป็นต้องมีการจัดการแบบใด

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

เห็นได้ชัดว่าความคิดเห็นของตัวแปรจำเป็นต้องได้รับการวินิจฉัยเพิ่มเติม การสังเกตครั้งแรกของตัวแปร Comments มีเพียงค่าที่ขาดหายไป

sum(df$Comments =="")

คำอธิบายรหัส

  • sum(df$Comments ==””): รวมข้อสังเกตที่มีค่าเท่ากับ “” ในความคิดเห็นของคอลัมน์จาก df

Output:

## [1] 181

เลือก()

เราจะเริ่มต้นด้วยกริยา select() เราไม่จำเป็นต้องใช้ตัวแปรทั้งหมด และแนวทางปฏิบัติที่ดีคือเลือกเฉพาะตัวแปรที่คุณคิดว่าเกี่ยวข้องเท่านั้น

เรามีข้อสังเกตที่ขาดหายไป 181 รายการ เกือบ 90 เปอร์เซ็นต์ของชุดข้อมูล หากคุณตัดสินใจที่จะยกเว้น คุณจะไม่สามารถดำเนินการวิเคราะห์ต่อไปได้

ความเป็นไปได้อีกอย่างคือปล่อยตัวแปร Comment ด้วยกริยา select()

เราสามารถเลือกตัวแปรได้หลายวิธีด้วย select() โปรดทราบว่าอาร์กิวเมนต์แรกคือชุดข้อมูล

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

คุณสามารถใช้วิธีที่สามเพื่อยกเว้นตัวแปร Comments

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

Output:

## [1] 205  14
dim(step_1_df)

Output:

## [1] 205  13

ชุดข้อมูลดั้งเดิมมี 14 คุณสมบัติในขณะที่ step_1_df มี 13 คุณสมบัติ

กรอง()

กริยา filter() ช่วยให้การสังเกตเป็นไปตามเกณฑ์ที่กำหนด filter() ทำงานเหมือนกับ select() ทุกประการ คุณส่งเฟรมข้อมูลก่อน จากนั้นจึงส่งเงื่อนไขโดยคั่นด้วยเครื่องหมายจุลภาค:

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

เกณฑ์หนึ่ง

ประการแรก คุณสามารถนับจำนวนการสังเกตภายในแต่ละระดับของตัวแปรปัจจัยได้

table(step_1_df$GoingTo)

คำอธิบายรหัส

  • table(): นับจำนวนการสังเกตตามระดับ หมายเหตุ ยอมรับเฉพาะตัวแปรระดับปัจจัยเท่านั้น
  • table(step_1_df$GoingTo): นับจำนวนการเดินทางไปยังจุดหมายปลายทางสุดท้าย

Output:

## 
##  GSK Home 
##  105  100	

ตารางฟังก์ชัน() ระบุว่ามีรถ 105 คันไปที่ GSK และ 100 คันไปที่ Home

เราสามารถกรองข้อมูลเพื่อส่งคืนชุดข้อมูลชุดหนึ่งที่มีการสังเกต 105 ครั้ง และอีกชุดหนึ่งที่มีการสังเกต 100 ครั้ง

# 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

เกณฑ์หลายประการ

เราสามารถกรองชุดข้อมูลที่มีมากกว่าหนึ่งเกณฑ์ได้ ตัวอย่างเช่น คุณสามารถดึงข้อมูลข้อสังเกตที่ปลายทางคือบ้านและเกิดขึ้นในวันพุธได้

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

Output:

## [1] 23 14

ข้อสังเกต 23 รายการตรงกับเกณฑ์นี้

ท่อ

การสร้างชุดข้อมูลต้องมีการดำเนินการมากมาย เช่น:

  • การนำเข้า
  • การผสม
  • การเลือก
  • กรอง
  • เป็นต้น

ไลบรารี dplyr มาพร้อมกับตัวดำเนินการใช้งานจริง %>% เรียกว่า ท่อ- คุณสมบัติไปป์ไลน์ทำให้การจัดการสะอาด รวดเร็ว และไม่เกิดข้อผิดพลาด

ตัวดำเนินการนี้เป็นโค้ดที่ดำเนินการขั้นตอนต่างๆ โดยไม่บันทึกขั้นตอนกลางๆ ลงในฮาร์ดไดรฟ์ หากคุณกลับมาดูตัวอย่างด้านบน คุณสามารถเลือกตัวแปรที่สนใจและกรองตัวแปรเหล่านั้นได้ เรามีสามขั้นตอน:

  • ขั้นตอนที่ 1: นำเข้าข้อมูล: นำเข้าข้อมูล GPS
  • ขั้นตอนที่ 2: เลือกข้อมูล: เลือก GoingTo และ DayOfWeek
  • ขั้นตอนที่ 3: กรองข้อมูล: ส่งคืนเฉพาะหน้าแรกและวันพุธ

เราสามารถใช้วิธีที่ยากในการทำมันได้:

# 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	

นั่นไม่ใช่วิธีที่สะดวกในการดำเนินการหลายอย่าง โดยเฉพาะในสถานการณ์ที่มีขั้นตอนมากมาย สภาพแวดล้อมจะจบลงด้วยการจัดเก็บวัตถุจำนวนมาก

ลองใช้ตัวดำเนินการไปป์ไลน์ %>% แทน เราเพียงแค่ต้องกำหนดเฟรมข้อมูลที่ใช้ในตอนเริ่มต้น และกระบวนการทั้งหมดจะไหลจากเฟรมนั้น

ไวยากรณ์พื้นฐานของไปป์ไลน์

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.

คุณสามารถสร้างท่อแรกของคุณได้โดยทำตามขั้นตอนที่ระบุไว้ข้างต้น

# 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

เรามีความพร้อมที่จะสร้างชุดข้อมูลที่น่าทึ่งด้วยตัวดำเนินการท่อ

จัด()

ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร กวดวิชาก่อนหน้านี้คุณจะได้เรียนรู้วิธีจัดเรียงค่าด้วยฟังก์ชัน sort() ไลบรารี dplyr มีฟังก์ชันการเรียงลำดับ มันใช้งานได้อย่างมีเสน่ห์กับไปป์ไลน์ กริยา Arrange() สามารถเรียงลำดับแถวใหม่ได้ตั้งแต่หนึ่งแถวขึ้นไป (ค่าเริ่มต้น) หรือจากมากไปน้อย

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

เราสามารถจัดเรียงระยะทางตามจุดหมายปลายทางได้

# 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

สรุป

ในตารางด้านล่างนี้ คุณจะสรุปการดำเนินการทั้งหมดที่คุณได้เรียนรู้ในระหว่างบทช่วยสอน

คำกริยา วัตถุประสงค์ รหัส คำอธิบาย
เหลือบ ตรวจสอบโครงสร้างของ df
glimpse(df)
เหมือนกับ str()
เลือก() เลือก/ไม่รวมตัวแปร
select(df, A, B ,C)
เลือกตัวแปร A, B และ C
select(df, A:C)
เลือกตัวแปรทั้งหมดจาก A ถึง C
select(df, -C)
ไม่รวม C
กรอง() กรอง df ตามเงื่อนไขหนึ่งหรือหลายเงื่อนไข
filter(df, condition1)
เงื่อนไขหนึ่ง
filter(df, condition1
ครั้งต่อไป2)
จัด() จัดเรียงชุดข้อมูลด้วยตัวแปรหนึ่งหรือหลายตัวแปร
arrange(A)
การเรียงลำดับของตัวแปร A จากน้อยไปหามาก
arrange(A, B)
การเรียงลำดับของตัวแปร A และ B จากน้อยไปหามาก
arrange(desc(A), B)
การเรียงลำดับของตัวแปร A จากมากไปน้อยและการเรียงลำดับจากน้อยไปหามากของ B
- สร้างไปป์ไลน์ระหว่างแต่ละขั้นตอน
step 1 %>% step 2 %>% step 3