วิธีผสานข้อมูลใน 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 NAhead (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.y
merge(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
ต่อไปมาดูวิธีการเชื่อมต่อที่รวดเร็วเป็นพิเศษ