วิธีผสานข้อมูลใน R โดยใช้ R merge, dplyr หรือ data.table

R มีวิธีที่รวดเร็วและสวยงามหลายวิธีในการเชื่อมต่อเฟรมข้อมูลด้วยคอลัมน์ทั่วไป ฉันต้องการแสดงให้คุณเห็นสามคน:

  • merge()ฟังก์ชันฐาน R
  • dplyr เข้าร่วมตระกูลฟังก์ชันและ
  • ไวยากรณ์วงเล็บของ data.table

รับและนำเข้าข้อมูล

สำหรับตัวอย่างนี้ฉันจะใช้ชุดข้อมูลสาธิตที่ชื่นชอบ - เวลาล่าช้าของเที่ยวบินจาก US Bureau of Transportation Statistics ถ้าคุณต้องการที่จะทำตามหัวเพื่อ //bit.ly/USFlightDelays และดาวน์โหลดข้อมูลสำหรับกรอบเวลาที่คุณเลือกด้วยคอลัมน์เที่ยวบินวัน , Reporting_Airline , แหล่งกำเนิด , ปลายทางและDepartureDelayMinutes รับตารางการค้นหาสำหรับReporting_Airlineด้วย

หรือดาวน์โหลดชุดข้อมูลทั้งสองนี้รวมทั้งรหัส R ของฉันในไฟล์เดียวและ PowerPoint ที่อธิบายการผสานข้อมูลประเภทต่างๆที่นี่:

ดาวน์โหลดรหัสข้อมูลและ PowerPoint สำหรับวิธีการรวมข้อมูลใน R รวมไฟล์ข้อมูลหลายไฟล์สคริปต์ PowerPoint และ R เพื่อประกอบบทความ ชารอนมัคลิส

หากต้องการอ่านในแฟ้มที่มีฐาน R, read.csv()ครั้งแรกที่ผมเปิดเครื่องรูดแฟ้มเที่ยวบินล่าช้าและจากนั้นจะนำเข้าทั้งข้อมูลเที่ยวบินล่าช้าและไฟล์ค้นหารหัสด้วย หากคุณกำลังเรียกใช้โค้ดไฟล์ดีเลย์ที่คุณดาวน์โหลดอาจมีชื่อแตกต่างจากโค้ดด้านล่าง นอกจากนี้โปรดสังเกต.csv_นามสกุลที่ผิดปกติของไฟล์ค้นหา

เปิดเครื่องรูด ("673598238_T_ONTIME_REPORTING.zip")

mydf <- read.csv ("673598238_T_ONTIME_REPORTING.csv",

ก.ย. = ",", quote = "\" ")

mylookup <- read.csv ("L_UNIQUE_CARRIERS.csv_",

quote = "\" ", sep =", ")

ต่อไปฉันจะดูทั้งสองไฟล์ด้วยhead():

head (mydf) FL_DATE OP_UNIQUE_CARRIER ORIGIN DEST DEP_DELAY_NEW X 1 2019-08-01 DL ATL DFW 31 NA 2 2019-08-01 DL DFW ATL 0 NA 3 2019-08-01 DL IAH ATL 40 NA 4 2019-08-01 DL PDX SLC 0 NA 5 2019-08-01 DL SLC PDX 0 NA 6 2019-08-01 DL DTW ATL 10 NA

head (mylookup) Code Description 1 02Q Titan Airways 2 04Q Tradewind Aviation 3 05Q Comlux Aviation, AG 4 06Q Master Top Linhas Aereas Ltd. 5 07Q Flair Airlines Ltd. 6 09Q Swift Air, LLC d / b / a Eastern Air Lines d / b / a ตะวันออก

ผสานกับฐาน R

กรอบข้อมูลความล่าช้า mydf มีเฉพาะข้อมูลสายการบินตามรหัส mylookupฉันต้องการที่จะเพิ่มคอลัมน์ที่มีชื่อสายการบินจาก วิธีการหนึ่งที่ R ฐานการทำเช่นนี้กับฟังก์ชั่นการใช้ไวยากรณ์พื้นฐานmerge() merge(df1, df2)ไม่สำคัญว่าลำดับของเฟรมข้อมูล 1 และเฟรมข้อมูล 2 จะถือว่าเป็น x และเฟรมที่สองคือ y 

หากคอลัมน์ที่คุณต้องการที่จะเข้าร่วมโดยไม่ได้มีชื่อเดียวกันคุณต้องบอกผสานคอลัมน์ที่คุณต้องการที่จะเข้าร่วมโดย: by.xสำหรับ x ชื่อคอลัมน์กรอบข้อมูลและสำหรับปีหนึ่งเช่นby.ymerge(df1, df2, by.x = "df1ColName", by.y = "df2ColName")

นอกจากนี้คุณยังสามารถบอกผสานว่าคุณต้องการแถวทั้งหมดรวมทั้งคนโดยไม่ต้องมีการแข่งขันหรือเพียงแค่แถวที่ตรงกับข้อโต้แย้งและall.x all.yในกรณีนี้ฉันต้องการแถวทั้งหมดจากข้อมูลการหน่วงเวลา หากไม่มีรหัสสายการบินในตารางค้นหาฉันยังคงต้องการข้อมูล แต่ฉันไม่ต้องการแถวจากตารางค้นหาที่ไม่ได้อยู่ในข้อมูลความล่าช้า (มีรหัสบางอย่างสำหรับสายการบินเก่าที่ไม่บินอีกต่อไป) ดังนั้นall.xเท่ากับTRUEแต่เท่ากับall.y FALSEรหัสเต็ม:

join_df <- ผสาน (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "รหัส", all.x = TRUE, all.y = FALSE)

กรอบข้อมูลที่เข้าร่วมใหม่ประกอบด้วยคอลัมน์ชื่อคำอธิบายพร้อมชื่อสายการบินตามรหัสสายการบิน

head (join_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X ลักษณะ 1 9E 2019-08-12 JFK SYR 0 NA Endeavour Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavour Air Inc. 3 9E 2019-08-12 ORF LGA 0 NA Endeavour Air Inc. 4 9E 2019-08-13 IAH MSP 6 NA Endeavour Air Inc. 5 9E 2019-08-12 DTW JFK 58 NA Endeavour Air Inc. 6 9E 2019-08-12 SYR JFK 0 NA Endeavour Air Inc .

เข้าร่วมกับ dplyr

dplyr ใช้ไวยากรณ์ฐานข้อมูล SQL สำหรับฟังก์ชันการรวม การรวมด้านซ้าย  หมายถึง: รวมทุกอย่างทางซ้าย (เฟรมข้อมูล x อยู่ในอะไรmerge()) และแถวทั้งหมดที่ตรงกันจากกรอบข้อมูลด้านขวา (y) left_join(x, y)หากเข้าร่วมคอลัมน์มีชื่อเดียวกันทั้งหมดที่คุณต้องการก็คือ หากไม่มีชื่อเดียวกันคุณต้องมีbyข้อโต้แย้งเช่นleft_join(x, y, by = c("df1ColName" = "df2ColName")).

สังเกตไวยากรณ์สำหรับby: เป็นเวกเตอร์ที่มีชื่อโดยมีทั้งชื่อคอลัมน์ด้านซ้ายและด้านขวาในเครื่องหมายคำพูด

รหัสที่จะนำเข้าและรวมชุดข้อมูลทั้งสองโดยใช้left_join()อยู่ด้านล่าง เริ่มต้นด้วยการโหลดแพ็คเกจ dplyr และ readr จากนั้นอ่านสองไฟล์ด้วยไฟล์read_csv(). เวลาใช้read_csv()ฉันไม่จำเป็นต้องคลายซิปไฟล์ก่อน

ห้องสมุด (dplyr)

ห้องสมุด (ผู้อ่าน)

MyTibble <- read_csv ("673598238_T_ONTIME_REPORTING.zip")

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

โดย = c ("OP_UNIQUE_CARRIER" = "รหัส"))

read_csv()สร้างtibblesซึ่งเป็น data frame ประเภทหนึ่งที่มีคุณสมบัติพิเศษบางอย่าง left_join()ผสานทั้งสอง ดูไวยากรณ์: ในกรณีนี้ลำดับมีความสำคัญ left_join()หมายรวมถึงทุกแถวบนซ้ายหรือแรกชุดข้อมูล แต่เฉพาะแถวที่แข่งขันจากคนที่สอง และเนื่องจากฉันต้องการเข้าร่วมโดยสองคอลัมน์ที่มีชื่อต่างกันฉันจึงรวมbyอาร์กิวเมนต์ไว้ด้วย

เราสามารถดูโครงสร้างของผลลัพธ์ด้วย glimpse()ฟังก์ชันdplyr ซึ่งเป็นอีกวิธีหนึ่งในการดูรายการด้านบนของ data frame

เหลือบ (join_tibble) การสังเกต: 658,461 ตัวแปร: 7 $ FL_DATE 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01 … $ OP_UNIQUE_CARRIER "DL", "DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL ", … $ ORIGIN" ATL "," DFW "," IAH "," PDX "," SLC "," DTW "," ATL "," MSP "," JF … $ DEST "DFW", "ATL", "ATL", "SLC", "PDX", "ATL", "DTW "," JFK "," MS … $ DEP_DELAY_NEW 31, 0, 40, 0, 0, 10, 0, 22, 0, 0, 0, 17, 5, 2, 0, 0, 8, 0, … $ X6 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, … $ คำอธิบาย "Delta Air Lines Inc. ", "Delta Air Lines Inc. ", "เดลต้าแอร์…

ชุดข้อมูลที่เข้าร่วมนี้มีคอลัมน์ใหม่ที่มีชื่อสายการบิน หากคุณเรียกใช้รหัสรุ่นนี้ด้วยตัวเองคุณอาจสังเกตเห็นว่า dplyr เร็วกว่าฐาน R

ต่อไปมาดูวิธีการเชื่อมต่อที่รวดเร็วเป็นพิเศษ