บทช่วยสอน Dplyr: ผสานและรวมข้อมูลใน R ด้วยตัวอย่าง

บทนำสู่การวิเคราะห์ข้อมูล

การวิเคราะห์ข้อมูลสามารถแบ่งออกเป็นสามส่วน:

  • การสกัด: ขั้นแรก เราต้องรวบรวมข้อมูลจากหลายแหล่งแล้วรวมเข้าด้วยกัน
  • แปลง: ขั้นตอนนี้เกี่ยวข้องกับการจัดการข้อมูล เมื่อเรารวมแหล่งข้อมูลทั้งหมดแล้ว เราก็สามารถเริ่มทำความสะอาดข้อมูลได้
  • จินตนาการ: ขั้นตอนสุดท้ายคือการแสดงภาพข้อมูลของเราเพื่อตรวจสอบความผิดปกติ
กระบวนการวิเคราะห์ข้อมูล
กระบวนการวิเคราะห์ข้อมูล

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

อาร์ ดีพลีร์

R มีไลบรารีชื่อ dplyr เพื่อช่วยในการแปลงข้อมูล ไลบรารี dplyr ถูกสร้างขึ้นโดยพื้นฐานโดยมีฟังก์ชันสี่ฟังก์ชันเพื่อจัดการข้อมูลและคำกริยาห้าตัวเพื่อล้างข้อมูล หลังจากนั้นเราสามารถใช้ไลบรารี ggplot เพื่อวิเคราะห์และแสดงข้อมูลเป็นภาพได้

เราจะเรียนรู้วิธีใช้ไลบรารี dplyr เพื่อจัดการไฟล์ กรอบข้อมูล.

รวมข้อมูลด้วย R Dplyr

dplyr เป็นวิธีที่ดีและสะดวกในการรวมชุดข้อมูล เราอาจมีแหล่งข้อมูลอินพุตมากมาย และเมื่อถึงจุดหนึ่ง เราจำเป็นต้องรวมเข้าด้วยกัน การรวมกับ dplyr จะเพิ่มตัวแปรทางด้านขวาของชุดข้อมูลดั้งเดิม

เข้าร่วม Dplyr

ต่อไปนี้เป็นประเภทการเข้าร่วมสี่ประเภทที่สำคัญที่ใช้ใน dplyr เพื่อผสานชุดข้อมูลสองชุด:

ฟังก์ชัน วัตถุประสงค์ ข้อโต้แย้ง หลายปุ่ม
left_join() รวมสองชุดข้อมูล เก็บข้อสังเกตทั้งหมดจากตารางต้นทาง ข้อมูล ต้นทาง ปลายทาง โดย = “ID” ต้นทาง, ปลายทาง, โดย = c (“ID”, “ID2”)
right_join() รวมสองชุดข้อมูล เก็บข้อสังเกตทั้งหมดจากตารางปลายทาง ข้อมูล ต้นทาง ปลายทาง โดย = “ID” ต้นทาง, ปลายทาง, โดย = c (“ID”, “ID2”)
inner_join() รวมสองชุดข้อมูล ไม่รวมแถวที่ไม่ตรงกันทั้งหมด ข้อมูล ต้นทาง ปลายทาง โดย = “ID” ต้นทาง, ปลายทาง, โดย = c (“ID”, “ID2”)
เต็ม_เข้าร่วม() รวมสองชุดข้อมูล เก็บทุกข้อสังเกต ข้อมูล ต้นทาง ปลายทาง โดย = “ID” ต้นทาง, ปลายทาง, โดย = c (“ID”, “ID2”)

เราจะศึกษาประเภทการรวมทั้งหมดผ่านตัวอย่างง่ายๆ

ก่อนอื่น เราสร้างชุดข้อมูลสองชุด ตารางที่ 1 มีสองตัวแปร ID และ y ในขณะที่ตารางที่ 2 รวบรวม ID และ z ในแต่ละสถานการณ์เราจำเป็นต้องมี คีย์คู่ ตัวแปร. ในกรณีของเรา ID คือของเรา สำคัญ ตัวแปร. ฟังก์ชันจะค้นหาค่าที่เหมือนกันในทั้งสองตารางและผูกค่าที่ส่งคืนทางด้านขวาของตารางที่ 1

รวมข้อมูลด้วย R Dplyr

library(dplyr)
df_primary <- tribble(
  ~ID, ~y,
   "A", 5,
   "B", 5,
   "C", 8,
   "D", 0,
  "F", 9)
df_secondary <- tribble(
  ~ID, ~z,
   "A", 30,
   "B", 21,
   "C", 22,
   "D", 25,
   "E", 29)

Dplyr left_join()

วิธีทั่วไปในการรวมชุดข้อมูลสองชุดเข้าด้วยกันคือการใช้ฟังก์ชัน left_join() จากภาพด้านล่าง เราจะเห็นได้ว่าคู่คีย์ตรงกับแถว A, B, C และ D จากชุดข้อมูลทั้งสองอย่างสมบูรณ์ อย่างไรก็ตาม E และ F ยังคงอยู่ เราจะปฏิบัติต่อข้อสังเกตทั้งสองนี้อย่างไร ด้วย left_join() เราจะเก็บตัวแปรทั้งหมดไว้ในตารางดั้งเดิม และไม่พิจารณาตัวแปรที่ไม่มีการจับคู่คีย์ในตารางปลายทาง ในตัวอย่างของเรา ไม่มีตัวแปร E ในตารางที่ 1 ดังนั้น แถวจะถูกละทิ้ง ตัวแปร F มาจากตารางต้นทาง มันจะถูกเก็บไว้หลัง left_join() และส่งคืน NA ในคอลัมน์ z รูปด้านล่างจำลองสิ่งที่จะเกิดขึ้นกับ left_join()

ตัวอย่างของ dplyr left_join()

ตัวอย่างของ dplyr left_join()

left_join(df_primary, df_secondary, by ='ID')

Output:

## 
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>		
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA

Dplyr right_join()

ฟังก์ชัน right_join() ทำงานเหมือนกับ left_join() ทุกประการ ข้อแตกต่างเพียงอย่างเดียวคือแถวที่ถูกทิ้ง ค่า E ที่มีอยู่ในกรอบข้อมูลปลายทางมีอยู่ในตารางใหม่ และรับค่า NA สำหรับคอลัมน์ y

ตัวอย่างของ dplyr right_join()

ตัวอย่างของ dplyr right_join()

right_join(df_primary, df_secondary, by = 'ID')

Output:

##
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     E    NA    29

Dplyr Inner_join()

เมื่อเราแน่ใจ 100% ว่าชุดข้อมูลทั้งสองจะไม่ตรงกัน เราก็อาจพิจารณาส่งคืนได้ เพียง แถวที่มีอยู่ใน ทั้งสอง ชุดข้อมูล สิ่งนี้เป็นไปได้เมื่อเราต้องการชุดข้อมูลที่สะอาดหมดจด หรือเมื่อเราไม่ต้องการใส่ค่าที่หายไปด้วยค่าเฉลี่ยหรือค่ามัธยฐาน

inner_join() มาช่วย ฟังก์ชันนี้จะยกเว้นแถวที่ไม่ตรงกัน

ตัวอย่างของ dplyr inner_join()

ตัวอย่างของ dplyr inner_join()

inner_join(df_primary, df_secondary, by ='ID')

Output:

## 
# A tibble: 4 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25

Dplyr full_join()

สุดท้าย ฟังก์ชัน full_join() จะเก็บการสังเกตทั้งหมดและแทนที่ค่าที่หายไปด้วย NA

ตัวอย่างของ dplyr full_join()

ตัวอย่างของ dplyr full_join()

full_join(df_primary, df_secondary, by = 'ID')

Output:

## # A tibble: 6 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA
## 6     E    NA    29

หลายคู่คีย์

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

หลายคู่คีย์ใน R

หากเราพยายามรวมตารางทั้งสองเข้าด้วยกัน R จะแสดงข้อผิดพลาด เพื่อแก้ไขสถานการณ์นี้ เราสามารถส่งตัวแปรคู่คีย์สองตัวได้ นั่นคือ ID และปี ซึ่งปรากฏในชุดข้อมูลทั้งสองชุด เราสามารถใช้โค้ดต่อไปนี้เพื่อรวมตาราง 1 และตาราง 2

df_primary <- tribble(
  ~ID, ~year, ~items,
  "A", 2015,3,
  "A", 2016,7,
  "A", 2017,6,
  "B", 2015,4,
  "B", 2016,8,
  "B", 2017,7,
  "C", 2015,4,
  "C", 2016,6,
  "C", 2017,6)
df_secondary <- tribble(
  ~ID, ~year, ~prices,
  "A", 2015,9,
  "A", 2016,8,
  "A", 2017,12,
  "B", 2015,13,
  "B", 2016,14,
  "B", 2017,6,
  "C", 2015,15,
  "C", 2016,15,
  "C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))

Output:

## # A tibble: 9 x 4
##      ID  year items prices
##   <chr> <dbl> <dbl>  <dbl>
## 1     A  2015     3      9
## 2     A  2016     7      8
## 3     A  2017     6     12
## 4     B  2015     4     13
## 5     B  2016     8     14
## 6     B  2017     7      6
## 7     C  2015     4     15
## 8     C  2016     6     15
## 9     C  2017     6     13

ฟังก์ชั่นการล้างข้อมูลใน R

ต่อไปนี้เป็นฟังก์ชันสำคัญสี่ประการในการจัดระเบียบ (ทำความสะอาด) ข้อมูล:

ฟังก์ชัน วัตถุประสงค์ ข้อโต้แย้ง
รวมตัว() แปลงข้อมูลจากกว้างไปยาว (ข้อมูล คีย์ ค่า na.rm = FALSE)
การแพร่กระจาย() แปลงข้อมูลจากยาวไปเป็นกว้าง (ข้อมูล คีย์ ค่า)
แยก() แบ่งตัวแปรหนึ่งตัวออกเป็นสองตัวแปร (data, col, into, sep= “”, ลบ = TRUE)
หน่วย() หน่วยสองตัวแปรให้เป็นหนึ่งเดียว (ข้อมูล, col, conc ,sep= “”, ลบ = TRUE)

เราใช้ห้องสมุดที่เป็นระเบียบเรียบร้อย ไลบรารีนี้เป็นของคอลเลกชันของไลบรารีเพื่อจัดการ ทำความสะอาด และแสดงภาพข้อมูล หากเราติดตั้ง R ด้วยอนาคอนดา แสดงว่าไลบรารีได้รับการติดตั้งแล้ว เราสามารถหาห้องสมุดได้ที่นี่ https://anaconda.org/r/r-tidyr.

หากยังไม่ได้ติดตั้ง ให้ป้อนคำสั่งต่อไปนี้เพื่อติดตั้ง tidyr:

install tidyr : install.packages("tidyr")

รวมตัว()

วัตถุประสงค์ของฟังก์ชัน Gather() คือการแปลงข้อมูลจากกว้างไปเป็นยาว

วากยสัมพันธ์

gather(data, key, value, na.rm = FALSE)
Arguments:
-data: The data frame used to reshape the dataset 
-key: Name of the new column created
-value: Select the columns used to fill the key column
-na.rm: Remove missing values. FALSE by default

ตัวอย่าง

ด้านล่างนี้ เราจะเห็นภาพแนวคิดของการปรับรูปร่างใหม่จากกว้างเป็นยาวได้ เราต้องการสร้างคอลัมน์เดียวชื่อการเติบโต ซึ่งเต็มไปด้วยแถวของตัวแปรไตรมาส

ตัวอย่างฟังก์ชันรวบรวม() ใน R

library(tidyr)
# Create a messy dataset
messy <- data.frame(
  country = c("A", "B", "C"),
  q1_2017 = c(0.03, 0.05, 0.01),
  q2_2017 = c(0.05, 0.07, 0.02),
  q3_2017 = c(0.04, 0.05, 0.01),
  q4_2017 = c(0.03, 0.02, 0.04))
messy

Output:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04
# Reshape the data
tidier <-messy %>%
gather(quarter, growth, q1_2017:q4_2017)
tidier

Output:

##    country quarter growth
## 1        A q1_2017   0.03
## 2        B q1_2017   0.05
## 3        C q1_2017   0.01
## 4        A q2_2017   0.05
## 5        B q2_2017   0.07
## 6        C q2_2017   0.02
## 7        A q3_2017   0.04
## 8        B q3_2017   0.05
## 9        C q3_2017   0.01
## 10       A q4_2017   0.03
## 11       B q4_2017   0.02
## 12       C q4_2017   0.04

ในฟังก์ชัน Gather() เราสร้างไตรมาสและการเติบโตตัวแปรใหม่สองรายการเนื่องจากชุดข้อมูลเดิมของเรามีตัวแปรกลุ่มหนึ่งรายการ ได้แก่ คู่ประเทศและค่าคีย์

การแพร่กระจาย()

ฟังก์ชัน Spread() ทำหน้าที่ตรงกันข้ามกับ Gather

วากยสัมพันธ์

spread(data, key, value)
arguments: 
data: The data frame used to reshape the dataset
key: Column to reshape long to wide
value: Rows used to fill the new column

ตัวอย่าง

เราสามารถปรับรูปร่างชุดข้อมูลที่เป็นระเบียบมากขึ้นให้กลับมายุ่งเหยิงด้วย Spread()

# Reshape the data
messy_1 <- tidier %>%
  spread(quarter, growth) 
messy_1

Output:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04

แยก()

ฟังก์ชัน Separate() แยกคอลัมน์ออกเป็นสองคอลัมน์ตามตัวคั่น ฟังก์ชันนี้มีประโยชน์ในบางสถานการณ์ที่ตัวแปรเป็นวันที่ การวิเคราะห์ของเราอาจต้องเน้นที่เดือนและปี และเราต้องการแยกคอลัมน์ออกเป็นตัวแปรใหม่สองตัว

วากยสัมพันธ์

separate(data, col, into, sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: The column to split
-into: The name of the new variables
-sep: Indicates the symbol used that separates the variable, i.e.:  "-", "_", "&"
-remove: Remove the old column. By default sets to TRUE.

ตัวอย่าง

เราสามารถแยกไตรมาสออกจากปีในชุดข้อมูลที่เป็นระเบียบยิ่งขึ้นได้โดยใช้ฟังก์ชัน Separate()

separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)

Output:

##   country Qrt year growth
## 1       A  q1 2017   0.03
## 2       B  q1 2017   0.05
## 3       C  q1 2017   0.01
## 4       A  q2 2017   0.05
## 5       B  q2 2017   0.07
## 6       C  q2 2017   0.02

รวมกัน()

ฟังก์ชัน unite() เชื่อมสองคอลัมน์ให้เป็นคอลัมน์เดียว

วากยสัมพันธ์

unit(data, col, conc ,sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: Name of the new column
-conc: Name of the columns to concatenate
-sep: Indicates the symbol used that unites the variable, i.e:  "-", "_", "&"
-remove: Remove the old columns. By default, sets to TRUE

ตัวอย่าง

ในตัวอย่างข้างต้น เราแยกไตรมาสออกจากปี หากต้องการรวมไตรมาสทั้งสองเข้าด้วยกัน เราใช้โค้ดต่อไปนี้:

unit_tidier <- separate_tidier %>%
  unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)

Output:

##   country Quarter growth
## 1       A q1_2017   0.03
## 2       B q1_2017   0.05
## 3       C q1_2017   0.01
## 4       A q2_2017   0.05
## 5       B q2_2017   0.07
## 6       C q2_2017   0.02

สรุป

  • การวิเคราะห์ข้อมูล สามารถแบ่งออกเป็นสามส่วน: การสกัด การแปลง และการแสดงภาพ
  • R มีไลบรารีชื่อ dplyr เพื่อช่วยในการแปลงข้อมูล ไลบรารี dplyr ถูกสร้างขึ้นโดยพื้นฐานโดยมีฟังก์ชันสี่ฟังก์ชันเพื่อจัดการข้อมูลและคำกริยาห้าตัวเพื่อล้างข้อมูล
  • dplyr เป็นวิธีที่ดีและสะดวกในการรวมชุดข้อมูล การรวมกับ dplyr จะเพิ่มตัวแปรทางด้านขวาของชุดข้อมูลดั้งเดิม
  • ความสวยงามของ dplyr คือมันรองรับการรวมสี่ประเภทที่คล้ายกัน SQL:
    • left_join() – เพื่อรวมชุดข้อมูลสองชุดและเก็บข้อมูลการสังเกตทั้งหมดจากตารางต้นทาง
    • right_join() – เพื่อรวมสองชุดข้อมูลและเก็บข้อมูลการสังเกตทั้งหมดจากตารางปลายทาง
    • inner_join() – เพื่อรวมสองชุดข้อมูลและแยกแถวที่ไม่ตรงกันทั้งหมด
    • เต็ม_เข้าร่วม() – เพื่อรวมสองชุดข้อมูลและเก็บข้อสังเกตทั้งหมด
  • เมื่อใช้ไลบรารี tidyr คุณสามารถแปลงชุดข้อมูลโดยใช้ฟังก์ชันต่อไปนี้:
    • รวมตัว(): แปลงข้อมูลจากกว้างไปยาว
    • การแพร่กระจาย(): แปลงข้อมูลจากยาวไปเป็นกว้าง
    • แยก(): แยกตัวแปรหนึ่งออกเป็นสองตัวแปร
    • หน่วย(): นำตัวแปรสองตัวมารวมกันเป็นหนึ่งเดียว