نحوه اتصال دو مجموعه داده توسط یک یا چند ستون معمولی را با استفاده از تابع ادغام پایه 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 است.
اگر ستونهایی که میخواهید به آنها بپیوندید نام یکسانی ندارند، باید بگویید که کدام ستونها را میخواهید ادغام کنید: 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 است.
در مرحله بعد، بیایید به یک روش فوق العاده سریع برای انجام پیوستن نگاه کنیم.
پست های مرتبط
نحوه ادغام داده ها در R با استفاده از R merge، dplyr یا data.table
نحوه ادغام داده ها در R با استفاده از R merge، dplyr یا data.table
نحوه ادغام داده ها در R با استفاده از R merge، dplyr یا data.table