Cara menggabungkan data dalam R menggunakan R merge, dplyr, atau data.table

R mempunyai sebilangan cara cepat dan elegan untuk menggabungkan bingkai data dengan lajur biasa. Saya ingin menunjukkan kepada anda tiga daripadanya:

  • merge()fungsi asas R ,
  • dplyr bergabung dengan keluarga fungsi, dan
  • sintaks pendakap data.table.

Dapatkan dan import data

Untuk contoh ini saya akan menggunakan salah satu set data demo kegemaran saya - masa penangguhan penerbangan dari Biro Perangkaan Pengangkutan AS. Sekiranya anda ingin mengikuti, pergi ke //bit.ly/USFlightDelays dan muat turun data untuk jangka masa pilihan anda dengan lajur Tarikh Penerbangan , Pelaporan_Airline , Asal , Destinasi , dan DepartureDelayMinutes . Dapatkan juga jadual carian untuk Pelaporan_Airline .

Atau, muat turun dua set data ini - ditambah kod R saya dalam satu fail dan PowerPoint yang menerangkan pelbagai jenis penggabungan data - di sini:

memuat turun Kod, data, dan PowerPoint untuk cara menggabungkan data di R Termasuk beberapa fail data, skrip PowerPoint, dan R untuk disertakan artikel. Sharon Machlis

Untuk membaca dalam fail dengan pangkalan R, pertama saya membuka zip fail penundaan penerbangan dan kemudian mengimport data penundaan penerbangan dan fail pencarian kod dengan read.csv(). Sekiranya anda menjalankan kod, fail kelewatan yang anda muat turun kemungkinan akan mempunyai nama yang berbeza daripada pada kod di bawah. Juga, perhatikan .csv_peluasan fail carian yang tidak biasa .

unzip ("673598238_T_ONTIME_REPORTING.zip")

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

sep = ",", petikan = "\" ")

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

petikan = "\" ", sep =", ")

Seterusnya, saya akan melihat kedua-dua fail dengan head():

kepala (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 Penerangan 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 Timur

Penggabungan dengan asas R

Rangka data penangguhan mydf hanya mempunyai maklumat syarikat penerbangan mengikut kod. Saya ingin menambah lajur dengan nama syarikat penerbangan dari mylookup. Satu kaedah asas R untuk melakukan ini adalah dengan merge()fungsi, menggunakan sintaks asas merge(df1, df2). Tidak masalah urutan bingkai data 1 dan bingkai data 2, tetapi mana yang pertama dianggap x dan yang kedua adalah y. 

Sekiranya lajur yang ingin anda gabungkan tidak mempunyai nama yang sama, anda perlu memberitahu menggabungkan lajur mana yang ingin anda gabungkan: by.xuntuk nama lajur bingkai data x, dan by.yuntuk lajur y, seperti merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Anda juga dapat mengetahui penggabungan sama ada anda mahu semua baris, termasuk baris tanpa padanan, atau hanya baris yang sesuai, dengan argumen all.xdan all.y. Dalam kes ini, saya mahu semua baris dari data kelewatan; jika tidak ada kod syarikat penerbangan dalam jadual carian, saya masih mahukan maklumat tersebut. Tetapi saya tidak memerlukan baris dari jadual pencarian yang tidak ada dalam data kelewatan (terdapat beberapa kod untuk syarikat penerbangan lama yang tidak lagi terbang di sana). Jadi, all.xsama TRUEtetapi all.ysama FALSE. Kod penuh:

join_df <- merge (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

oleh.y = "Code", all.x = TRUE, all.y = FALSE)

Rangka data bergabung baru merangkumi lajur yang disebut Penerangan dengan nama syarikat penerbangan berdasarkan kod pembawa.

head (join_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Description 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 .

Bergabung dengan dplyr

dplyr menggunakan sintaks pangkalan data SQL untuk fungsi bergabungnya. Gabungan kiri  bermaksud: Sertakan semua yang ada di sebelah kiri (di mana bingkai data x masuk merge()) dan semua baris yang sepadan dari bingkai data kanan (y). Sekiranya lajur bergabung mempunyai nama yang sama, semua yang anda perlukan adalah left_join(x, y). Sekiranya mereka tidak mempunyai nama yang sama, anda memerlukan byargumen, seperti left_join(x, y, by = c("df1ColName" = "df2ColName")).

Perhatikan sintaks untuk by: Ini adalah vektor bernama, dengan nama lajur kiri dan kanan dalam tanda petik.

Kod untuk mengimport dan menggabungkan kedua-dua set data menggunakan left_join()di bawah. Ia dimulakan dengan memuatkan pakej dplyr dan readr dan kemudian dibaca dalam dua fail dengan read_csv(). Semasa menggunakan read_csv(), saya tidak perlu membuka zip fail terlebih dahulu.

perpustakaan (dplyr)

perpustakaan (baca)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

oleh = c ("OP_UNIQUE_CARRIER" = "Kod"))

read_csv()mencipta tibbles , yang merupakan jenis kerangka data dengan beberapa ciri tambahan. left_join()menggabungkan kedua-duanya. Lihat sintaksnya: Dalam kes ini, urutan penting. left_join()bermaksud merangkumi semua baris di sebelah kiri, atau pertama, kumpulan data, tetapi hanya baris yang sepadan dengan yang kedua . Oleh kerana saya perlu bergabung dengan dua lajur yang berlainan nama, saya memasukkan byargumen.

Kita dapat melihat struktur hasilnya dengan glimpse()fungsi dplyr , yang merupakan cara lain untuk melihat beberapa item teratas dari bingkai data.

sekilas (join_tibble) Pemerhatian: 658,461 Pemboleh ubah: 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 ",… $ ASAL" 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,… $ Penerangan "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air…

Kumpulan data bergabung ini kini mempunyai lajur baru dengan nama syarikat penerbangan. Sekiranya anda menjalankan versi kod ini sendiri, anda mungkin akan menyedari bahawa dplyr jauh lebih pantas daripada asas R.

Seterusnya, mari kita lihat kaedah yang sangat pantas untuk bergabung.