۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه ادغام داده ها در R با استفاده از R merge، dplyr یا data.table

نحوه اتصال دو مجموعه داده توسط یک یا چند ستون معمولی را با استفاده از تابع ادغام پایه R، توابع پیوستن dplyr و بسته data.table سریع ببینید.

نحوه اتصال دو مجموعه داده توسط یک یا چند ستون معمولی را با استفاده از تابع ادغام پایه R، توابع پیوستن dplyr و بسته data.table سریع ببینید.

R تعدادی روش سریع و زیبا برای اتصال فریم های داده توسط یک ستون مشترک دارد. من می خواهم سه مورد از آنها را به شما نشان دهم:

    تابع

  • base R’s merge()
  • dplyr به خانواده توابع بپیوندید
  • نحو براکت

  • data.table

داده ها را دریافت و وارد کنید

برای این مثال، از یکی از مجموعه داده‌های آزمایشی مورد علاقه‌ام استفاده می‌کنم – زمان‌های تاخیر پرواز از اداره آمار حمل‌ونقل ایالات متحده. اگر می‌خواهید دنبال کنید، به http://bit.ly/USFlightDelays و دانلود داده‌ها برای بازه زمانی مورد نظر خود با ستون‌های تاریخ پرواز، گزارش_هواپیما، مبدا، مقصد، و DepartureDelayMinutes. همچنین جدول جستجوی Reporting_Airline را دریافت کنید.

یا، می‌توانید این دو مجموعه داده را دانلود کنید – به علاوه کد R من در یک فایل واحد و یک پاورپوینت که انواع مختلف ادغام داده‌ها را توضیح می‌دهد – از اینجا:

برای خواندن فایل با پایه R، ابتدا فایل تاخیر پرواز را از حالت فشرده خارج می کنم و سپس داده های تاخیر پرواز و فایل جستجوی کد را با read.csv() وارد می کنم. اگر کد را اجرا می کنید، فایل تاخیری که دانلود کرده اید احتمالاً نامی متفاوت از کد زیر خواهد داشت. همچنین، به پسوند غیرمعمول .csv_ فایل جستجو توجه کنید.


unzip("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
۱ ۲۰۱۹-۰۸-۰۱                DL    ATL  DFW            31 NA
۲ ۲۰۱۹-۰۸-۰۱                DL    DFW  ATL             0 NA
۳ ۲۰۱۹-۰۸-۰۱                DL    IAH  ATL            40 NA
۴ ۲۰۱۹-۰۸-۰۱                DL    PDX  SLC             0 NA
۵ ۲۰۱۹-۰۸-۰۱                DL    SLC  PDX             0 NA
۶ ۲۰۱۹-۰۸-۰۱                DL    DTW  ATL            10 NA

head(mylookup) Code Description ۱ ۰۲Q Titan Airways ۲ ۰۴Q Tradewind Aviation ۳ ۰۵Q Comlux Aviation, AG ۴ ۰۶Q Master Top Linhas Aereas Ltd. ۵ ۰۷Q Flair Airlines Ltd. ۶ ۰۹Q Swift Air, LLC d/b/a Eastern Air Lines d/b/a Eastern

با پایه R ادغام می شود

قاب داده تأخیر mydf فقط اطلاعات خطوط هوایی را براساس کد دارد. می‌خواهم ستونی با نام خطوط هوایی از mylookup اضافه کنم. یکی از راه های پایه R برای انجام این کار، استفاده از تابع merge()، با استفاده از نحو اصلی merge(df1, df2) است. ترتیب فریم داده ۱ و فریم داده ۲ مهم نیست، اما هر کدام اول باشد x و دومی y است.

مجموعه تحلیلی SAS Viya اکنون در بازار Azure موجود است

اگر ستون‌هایی که می‌خواهید به آن‌ها بپیوندید نام یکسانی ندارند، باید بگویید که کدام ستون‌ها را می‌خواهید ادغام کنید: by.x برای نام ستون x قاب داده، و by.y برای y، مانند merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName")..by.y. p>

همچنین می‌توانید با آرگومان‌های all.x و all.y به ادغام بگویید، از جمله ردیف‌هایی که مطابقت ندارند، یا فقط ردیف‌هایی که مطابقت دارند. . در این مورد، من تمام ردیف های داده های تاخیر را می خواهم. اگر هیچ کد هواپیمایی در جدول جستجو وجود نداشته باشد، من هنوز اطلاعات را می خواهم. اما من نیازی به ردیف‌هایی از جدول جستجو ندارم که در داده‌های تاخیر وجود نداشته باشد (کدهایی برای خطوط هوایی قدیمی وجود دارد که دیگر در آنجا پرواز نمی‌کنند). بنابراین، all.x برابر است با TRUE اما all.y برابر است با FALSE. کد اینجاست:


joined_df <- merge(mydf, mylookup, by.x = "OP_UNIQUE_CARRIER", 
by.y = "Code", all.x = TRUE, all.y = FALSE)

قاب داده‌های پیوست شده جدید شامل ستونی به نام توضیحات با نام شرکت هواپیمایی بر اساس کد حامل است:


head(joined_df)
  OP_UNIQUE_CARRIER    FL_DATE ORIGIN DEST DEP_DELAY_NEW  X       Description
۱                ۹E 2019-08-12    JFK  SYR             0 NA Endeavor Air Inc.
۲                ۹E 2019-08-12    TYS  DTW             0 NA Endeavor Air Inc.
۳                ۹E 2019-08-12    ORF  LGA             0 NA Endeavor Air Inc.
۴                ۹E 2019-08-13    IAH  MSP             6 NA Endeavor Air Inc.
۵                ۹E 2019-08-12    DTW  JFK            58 NA Endeavor Air Inc.
۶                ۹E 2019-08-12    SYR  JFK             0 NA Endeavor Air Inc.

با dplyr می پیوندد

بسته dplyr از نحو پایگاه داده SQL برای توابع پیوستن خود استفاده می کند. پیوستن چپ به این معنی است: همه چیز را در سمت چپ (چه قاب داده x در merge() بود) و همه ردیف‌هایی که از قاب داده سمت راست (y) مطابقت دارند، بگنجانید. اگر ستون های پیوستن یک نام دارند، تنها چیزی که نیاز دارید left_join(x, y) است. اگر نام یکسانی ندارند، به آرگومان by نیاز دارید، مانند left_join(x, y, by = c("df1ColName" = "df2ColName")).

به نحو برای by توجه کنید: این یک بردار نام‌گذاری شده است که نام ستون‌های چپ و راست را در گیومه قرار داده است.

به‌روزرسانی: با شروع نسخه dplyr 1.1.0 (در CRAN از ۲۹ ژانویه ۲۰۲۳)، پیوست‌های dplyr دارای یک by اضافی هستند. نحو با استفاده از join_by():


left_join(x, y, by = join_by(df1ColName == df2ColName))

تابع کمکی جدید join_by()  از نام ستون‌های نقل قول نشده و عملگر بولی == استفاده می‌کند، که نویسندگان بسته می‌گویند در زمینه R منطقی‌تر از است. c("col1" = "col2")، زیرا = برای تخصیص یک مقدار به یک متغیر است، نه آزمایش برابری.


چپ پیوستن

یک پیوست سمت چپ همه ردیف‌ها را در قاب داده سمت چپ و فقط ردیف‌های منطبق را از قاب داده سمت راست نگه می‌دارد.

کد وارد کردن و ادغام هر دو مجموعه داده با استفاده از left_join() در زیر آمده است. با بارگیری بسته‌های dplyr و readr شروع می‌شود و سپس در دو فایل با read_csv() خوانده می‌شود. هنگام استفاده از read_csv()، لازم نیست ابتدا فایل را از حالت فشرده خارج کنم.


library(dplyr)
library(readr)

mytibble <- read_csv("673598238_T_ONTIME_REPORTING.zip")
mylookup_tibble <- read_csv("L_UNIQUE_CARRIERS.csv_")

joined_tibble <- left_join(mytibble، mylookup_tibble،
توسط = join_by(OP_UNIQUE_CARRIER == کد))

توجه داشته باشید که dplyr از نظر نحوی بدون ()join_by قدیمی‌تر است هنوز کار می‌کند


joined_tibble <- left_join(mytibble، mylookup_tibble،
توسط = c("OP_UNIQUE_CARRIER" = "کد"))

read_csv() tibbles را ایجاد می کند که نوعی قاب داده با برخی ویژگی های اضافی است. left_join() این دو را ادغام می کند. به نحو نگاهی بیندازید: در این مورد، نظم مهم است. left_join() به این معنی است که شامل همه ردیف‌های سمت چپ یا مجموعه داده اول است، اما فقط ردیف‌هایی که با ردیف دوم مطابقت دارند. و چون باید با دو ستون با نام متفاوت به هم بپیوندم، آرگومان by را وارد کردم.

نحو جدید پیوستن در نسخه فقط برای توسعه dplyr به این صورت خواهد بود:


joined_tibble2 <- left_join(mytibble, mylookup_tibble, 
by = join_by(OP_UNIQUE_CARRIER == Code))

از آنجایی که اکثر افراد احتمالاً نسخه CRAN را دارند، من از دستور اصلی dplyr در ادامه این مقاله استفاده خواهم کرد، تا اینکه join_by() بخشی از نسخه CRAN می شود.

ما می‌توانیم با استفاده از تابع glimpse() در dplyr به ساختار نتیجه نگاه کنیم، که روش دیگری برای دیدن چند مورد برتر یک قاب داده است:


glimpse(joined_tibble)
Observations: 658,461
Variables: 7
$ FL_DATE           <date> 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01…
$ OP_UNIQUE_CARRIER <chr> "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL",…
$ ORIGIN            <chr> "ATL", "DFW", "IAH", "PDX", "SLC", "DTW", "ATL", "MSP", "JF…
$ DEST              <chr> "DFW", "ATL", "ATL", "SLC", "PDX", "ATL", "DTW", "JFK", "MS…
$ DEP_DELAY_NEW     <dbl> 31, 0, 40, 0, 0, 10, 0, 22, 0, 0, 0, 17, 5, 2, 0, 0, 8, 0, …
$ X6                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ Description       <chr> "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air …

این مجموعه داده پیوست شده اکنون دارای یک ستون جدید با نام شرکت هواپیمایی است. اگر خودتان نسخه‌ای از این کد را اجرا کنید، احتمالاً متوجه خواهید شد که dplyr بسیار سریع‌تر از پایه R است.

در مرحله بعد، بیایید به یک روش فوق العاده سریع برای انجام پیوستن نگاه کنیم.