บทช่วยสอน 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
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()
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()
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()
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()
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 จะแสดงข้อผิดพลาด เพื่อแก้ไขสถานการณ์นี้ เราสามารถส่งตัวแปรคู่คีย์สองตัวได้ นั่นคือ 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
ตัวอย่าง
ด้านล่างนี้ เราจะเห็นภาพแนวคิดของการปรับรูปร่างใหม่จากกว้างเป็นยาวได้ เราต้องการสร้างคอลัมน์เดียวชื่อการเติบโต ซึ่งเต็มไปด้วยแถวของตัวแปรไตรมาส
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 คุณสามารถแปลงชุดข้อมูลโดยใช้ฟังก์ชันต่อไปนี้:
- รวมตัว(): แปลงข้อมูลจากกว้างไปยาว
- การแพร่กระจาย(): แปลงข้อมูลจากยาวไปเป็นกว้าง
- แยก(): แยกตัวแปรหนึ่งออกเป็นสองตัวแปร
- หน่วย(): นำตัวแปรสองตัวมารวมกันเป็นหนึ่งเดียว