R merge, dplyr veya data.table kullanarak R'deki veriler nasıl birleştirilir

R, veri çerçevelerini ortak bir sütunla birleştirmenin birkaç hızlı ve zarif yoluna sahiptir. Size üç tanesini göstermek istiyorum:

  • baz R'nin merge()işlevi,
  • dplyr'in işlev ailesine katılması ve
  • data.table'ın köşeli ayraç sözdizimi.

Verileri alın ve içe aktarın

Bu örnek için en sevdiğim demo veri setlerinden birini kullanacağım - ABD Ulaşım İstatistikleri Bürosu'nun uçuş gecikme süreleri. Takip etmek istiyorsanız, //bit.ly/USFlightDelays adresine gidin ve seçtiğiniz zaman çerçevesi için Flight Date , Reporting_Airline , Origin , Destination ve DepartureDelayMinutes sütunlarıyla verileri indirin . Ayrıca Reporting_Airline için arama tablosunu alın .

Veya bu iki veri kümesini - artı tek bir dosyadaki R kodumu ve farklı veri birleştirme türlerini açıklayan bir PowerPoint - buradan indirin:

R'de verilerin nasıl birleştirileceğini öğrenmek için Kod, veri ve PowerPoint'i indirin Makaleye eşlik edecek birkaç veri dosyası, bir PowerPoint ve R komut dosyası içerir. Sharon Machlis

Dosyayı temel R ile okumak için, önce uçuş gecikme dosyasını açar ve ardından hem uçuş gecikme verilerini hem de kod arama dosyasını içeri aktarırdım read.csv(). Kodu çalıştırıyorsanız, indirdiğiniz gecikme dosyasının adı büyük olasılıkla aşağıdaki koddan farklı olacaktır. Ayrıca, arama dosyasının olağandışı .csv_uzantısına dikkat edin .

sıkıştırmayı açın ("673598238_T_ONTIME_REPORTING.zip")

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

sep = ",", alıntı = "\" ")

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

alıntı = "\" ", sep =", ")

Ardından, her iki dosyaya şu şekilde bir göz atacağım 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) Kod Açıklama 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 Doğu

R tabanı ile birleşir

Mydf gecikme veri çerçevesi yalnızca koda göre havayolu bilgilerini içerir. Havayolu adlarının bulunduğu bir sütun eklemek istiyorum mylookup. Bunu yapmanın temel R yolu merge(), temel sözdizimini kullanan işlevdir merge(df1, df2). Veri çerçevesi 1 ve veri çerçevesi 2'nin sıralaması önemli değildir, ancak hangisi ilk olursa x, ikincisi y olarak kabul edilir. 

Katılmak istediğiniz sütunlar aynı ada sahip değilse, birleştirmek istediğiniz sütunlara şunu söylemeniz gerekir: by.xx veri çerçevesi sütun adı by.yiçin ve y biri için, örneğin merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Ayrıca, eşleşmeyenler de dahil olmak üzere tüm satırları mı yoksa yalnızca argümanlarla eşleşen satırları mı istediğinizi all.xve all.y. Bu durumda, gecikme verilerindeki tüm satırları istiyorum; arama tablosunda havayolu kodu yoksa, bilgileri yine de istiyorum. Ancak arama tablosundaki gecikme verilerinde olmayan satırlara ihtiyacım yok (artık orada uçmayan eski havayolları için bazı kodlar var). Yani all.xeşittir TRUEama all.yeşittir FALSE. Tam kod:

katıldı_df <- birleştirme (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Kod", all.x = DOĞRU, tümü.y = YANLIŞ)

Yeni birleştirilmiş veri çerçevesi, taşıyıcı koduna göre havayolunun adını taşıyan Açıklama adlı bir sütun içerir.

kafa (katıldı_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Açıklama 1 9E 2019-08-12 JFK SYR 0 NA Endeavor Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavor Air Inc. 3 9E 2019-08-12 ORF LGA 0 NA Endeavor Air Inc. 4 9E 2019-08-13 IAH MSP 6 NA Endeavor Air Inc. 5 9E 2019-08-12 DTW JFK 58 NA Endeavor Air Inc. 6 9E 2019-08-12 SYR JFK 0 NA Endeavor Air Inc .

Dplyr ile katıldı

dplyr, birleştirme işlevleri için SQL veritabanı sözdizimini kullanır. Bir sol katılmak  aracı: (x veri çerçevesi ne solda her şeyi dahil merge()) ve tüm satırları bu doğru (y) veri çerçevesinden maç. Birleştirme sütunları aynı ada sahipse, ihtiyacınız olan tek şey left_join(x, y). Aynı isme sahip değillerse by, gibi bir argümana ihtiyacınız var left_join(x, y, by = c("df1ColName" = "df2ColName")).

byŞunun sözdizimine dikkat edin : Bu, hem sol hem de sağ sütun adlarının tırnak içinde bulunduğu adlandırılmış bir vektördür.

Her iki veri kümesini kullanarak içe aktarmak ve birleştirmek için kod left_join()aşağıdadır. Dplyr ve readr paketlerini yükleyerek başlar ve ardından iki dosyayı read_csv(). Kullanırken read_csv()önce dosyayı açmam gerekmiyor.

kütüphane (dplyr)

kütüphane (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

katıldı_tibble <- left_join (mytibble, mylookup_tibble,

by = c ("OP_UNIQUE_CARRIER" = "Kod"))

read_csv()bazı ekstra özelliklere sahip bir veri çerçevesi türü olan tibbles oluşturur . left_join()ikisini birleştirir. Söz dizimine bir göz atın: Bu durumda sıra önemlidir. left_join()Bu , soldaki tüm satırları veya birinci veri kümesini, ancak yalnızca ikinciyle eşleşen satırları içerir . Ve farklı adlandırılmış iki sütuna katılmam gerektiğinden, bir byargüman ekledim.

glimpse()Bir veri çerçevesinin ilk birkaç öğesini görmenin başka bir yolu olan dplyr işlevi ile sonucun yapısına bakabiliriz .

bakış (birleştirilmiş_tibble) Gözlemler: 658,461 Değişkenler: 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,… $ Açıklama "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air…

Bu birleştirilmiş veri kümesinde artık havayolunun adıyla yeni bir sütun var. Bu kodun bir sürümünü kendiniz çalıştırırsanız, muhtemelen dplyr'in R tabanından çok daha hızlı olduğunu fark edeceksiniz.

Şimdi, birleştirme yapmanın süper hızlı bir yoluna bakalım.