כיצד למזג נתונים ב- R באמצעות מיזוג R, dplyr או data.table

ל- R יש מספר דרכים מהירות ואלגנטיות להצטרף למסגרות נתונים באמצעות עמודה נפוצה. ברצוני להראות לך שלוש מהן:

  • merge()הפונקציה של בסיס R ,
  • dplyr מצטרף למשפחת הפונקציות, ו
  • תחביר הסוגר של data.table.

קבל וייבא את הנתונים

לדוגמא זו אשתמש באחת ממערכי נתוני ההדגמה האהובים עלי ביותר - זמני עיכוב טיסה מלשכת הסטטיסטיקה לתחבורה בארה"ב. אם ברצונך לעקוב אחריו, עבור אל //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",

sep = ",", 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) תיאור קוד 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.yy, כגון merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

אתה יכול גם לומר למיזוג אם אתה רוצה את כל השורות, כולל אלה ללא התאמה, או רק שורות שתואמות, עם הארגומנטים all.xו- all.y. במקרה זה, אני רוצה את כל השורות מנתוני העיכוב; אם אין קוד תעופה בטבלת הבדיקה, אני עדיין רוצה את המידע. אבל אני לא צריך שורות מטבלת החיפוש שלא נמצאות בנתוני העיכוב (יש כמה קודים לחברות תעופה ותיקות שלא טסות יותר שם). אז, all.xשווה TRUEאבל all.yשווה FALSE. קוד מלא:

joined_df <- מיזוג (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "קוד", all.x = TRUE, all.y = FALSE)

מסגרת הנתונים החדשה שהצטרפה כוללת עמודה בשם תיאור עם שם חברת התעופה על בסיס קוד הספק.

head (joined_df) OP_UNIQUE_CARRIER FL_DATE המקור 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 Endeavor Air Inc. 4 9E 13-08-2019 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)

ספרייה (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

joined_tibble <- left_join (mytibble, mylookup_tibble,

מאת = c ("OP_UNIQUE_CARRIER" = "קוד"))

read_csv()יוצר טיפוסים , שהם סוג של מסגרת נתונים עם כמה תכונות נוספות. left_join()ממזג את השניים. התבונן בתחביר: במקרה זה, סדר חשוב. left_join()פירושו לכלול את כל השורות בצד שמאל, או ראשון, בערכת הנתונים, אך רק בשורות התואמות מהשנייה השנייה . ומכיוון שאני צריך להצטרף לשתי עמודות בעלות שם שונה, כללתי byטיעון.

אנו יכולים להסתכל על מבנה התוצאה בעזרת glimpse()הפונקציה של dplyr , שהיא דרך נוספת לראות את הפריטים המובילים ביותר של מסגרת נתונים.

הצצה (joined_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, ... $ תיאור "Delta Air Lines Inc.", "Delta Air Lines Inc.", "דלתא אייר ...

ערכת הנתונים המצטרפת הזו כוללת כעת עמודה חדשה עם שם חברת התעופה. אם אתה מריץ גרסה של קוד זה בעצמך, סביר להניח שתבחין ש- dplyr היה מהיר בהרבה מבסיס R.

לאחר מכן, בואו נסתכל על דרך מהירה במיוחד לבצע הצטרפות.