Manipulasi Database Menggunakan R

Pada proses analisis data, kita jarang melibatkan hanya satu tabel data. Biasanya kita memiliki banyak tabel data untuk diproses sesuai dengan tujuan kita, dimana harus menggabungkan dua atau lebih tabel data. Secara umum, beberapa tabel data yang tergabung pada satu kesatuan disebut sebagai data relasional.

Relasi selalu ditentukan antara sepasang tabel data, dimana setiap relasi dibangun dari properti relasi antara setiap pasangan tabel data. Tempat paling umum untuk menemukan data relasional adalah di sistem manajemen database relasional (atau RDBMS). Untuk membuat sistem database yang terintegrasi, maka antara satu tabel dengan tabel lain mempunyai hubungan yang harus selalu diperlihara. Setiap tabel mempunyai sebuah primary key. Primary key ini kemudian dihubungkan dengan tabel kedua dan menjadi foreign key untuk tabel kedua ini.

SQL merupakan salah satu sistem manajemen database yang biasa digunakan untuk mengelola data relasional. Akan tetapi, bahasa pemrograman SQL masih belum cukup jika kita ingin melakukan visualisasi data relasional. Untuk itu, diperlukan kombinasi bahasa pemrograman lain yang dapat memudahkan kita melakukan visualisasi database secara lebih mendalam, yaitu diantaranya yang populer saat ini adalah bahasa pemorgaraman R.

Beberapa package yang digunakan untuk bekerja dengan database menggunakan R software adalah:

1. Menghubungkan ke Database

Pada kesempatan ini, saya akan mengakses database chinook. Untuk dapat melakukannya, perlu dipastikan package DBI dan RSQLite telah terinstall.

A. Mengaktifkan Library

Karena DBI dan RSQLite telah terinstall sebelumnya, maka langkah selanjutnya adalah memanggil package tidyverse yang mencakup beberapa package yang dibutuhkan salah satunya dplyr serta memanggil package RSQLite dan DBIuntuk mengakses dan mengolah database terkait.

library("tidyverse")
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.4     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   2.0.1     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library("DBI")
library("RSQLite")

B. Koneksi Database

Secara umum, koneksi terhadap database pada R dapat menggunakan sintaks berikut: DBI::dbConnect(RSQLite::SQLite(), path = ":dbname:")

chinook<-DBI::dbConnect(RSQLite::SQLite(),"C:/sqlite/db/chinook.db")

C. Melihat Daftar Tabel

Pada bagian ini dirinci isi tabel yang terdapat dalam database chinook, yang ternyata berjumlah 13 tabel.

RSQLite::dbListTables(chinook)
##  [1] "albums"          "artists"         "customers"       "employees"      
##  [5] "genres"          "invoice_items"   "invoices"        "media_types"    
##  [9] "playlist_track"  "playlists"       "sqlite_sequence" "sqlite_stat1"   
## [13] "tracks"

D. Melihat Isi Kolom pada Masing-masing Tabel

Setelah mengetahui jumlah tabel yang terdapat dalam database chinook, langkah selanjutnya adalah merinci isi kolom yang ada pada masing-masing tabel agar memudahkan dalam proses analisis lebih lanjut.

colnames(albums)
## [1] "AlbumId"  "Title"    "ArtistId"
colnames(artists)
## [1] "ArtistId" "Name"
colnames(customers)
##  [1] "CustomerId"   "FirstName"    "LastName"     "Company"      "Address"     
##  [6] "City"         "State"        "Country"      "PostalCode"   "Phone"       
## [11] "Fax"          "Email"        "SupportRepId"
colnames(employees)
##  [1] "EmployeeId" "LastName"   "FirstName"  "Title"      "ReportsTo" 
##  [6] "BirthDate"  "HireDate"   "Address"    "City"       "State"     
## [11] "Country"    "PostalCode" "Phone"      "Fax"        "Email"
colnames(genres)
## [1] "GenreId" "Name"
colnames(invoice_items)
## [1] "InvoiceLineId" "InvoiceId"     "TrackId"       "UnitPrice"    
## [5] "Quantity"
colnames(invoices)
## [1] "InvoiceId"         "CustomerId"        "InvoiceDate"      
## [4] "BillingAddress"    "BillingCity"       "BillingState"     
## [7] "BillingCountry"    "BillingPostalCode" "Total"
colnames(media_types)
## [1] "MediaTypeId" "Name"
colnames(playlist_track)
## [1] "PlaylistId" "TrackId"
colnames(playlists)
## [1] "PlaylistId" "Name"
colnames(sqlite_sequence)
## [1] "name" "seq"
colnames(sqlite_stat1)
## [1] "tbl"  "idx"  "stat"
colnames(tracks)
## [1] "TrackId"      "Name"         "AlbumId"      "MediaTypeId"  "GenreId"     
## [6] "Composer"     "Milliseconds" "Bytes"        "UnitPrice"

2. Menggabungkan Sejumlah Tabel dalam Database

Pada bagian ini akan dibahas penggunaan beberapa tabel. Sebagimana telah disebutkan dibagian sebelumnya, terdapat 13 tabel yang dapat digunakan. Ada beberapa cara yang bisa dilakukan untuk menggabungkan sejumlah tabel dalam database, yaitu dengan melakukan merge/join tabel, seperti fungsi berikut ini:

A. Fungsi inner_join()

Fungsi inner_join() menghasilkan semua baris pada table x yang memiliki kesamaan nilai dengan table y, dan semua kolom dari x dan y. Ilustrasi dapat dilihat pada gambar berikut:

Berikut ditampilkan hasil penggabungan data secara inner_join pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

employees <- tbl(chinook,"employees")
head(employees)
EmployeeId LastName FirstName Title ReportsTo BirthDate HireDate Address City State Country PostalCode Phone Fax Email
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899
customers <- tbl(chinook,"customers")
head(customers)
CustomerId FirstName LastName Company Address City State Country PostalCode Phone Fax Email SupportRepId
1 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 3
2 Leonie Köhler NA Theodor-Heuss-Straße 34 Stuttgart NA Germany 70174 +49 0711 2842222 NA 5
3 François Tremblay NA 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 NA 3
4 Bjørn Hansen NA Ullevålsveien 14 Oslo NA Norway 0171 +47 22 44 22 22 NA 4
5 František Wichterlová JetBrains s.r.o. Klanova 9/506 Prague NA Czech Republic 14700 +420 2 4172 5555 +420 2 4172 5555 4
6 Helena Holý NA Rilská 3174/6 Prague NA Czech Republic 14300 +420 2 4177 0449 NA 5
inner_join <- employees %>% inner_join(customers, by=c("EmployeeId"= "CustomerId"))
head(inner_join)
EmployeeId LastName.x FirstName.x Title ReportsTo BirthDate HireDate Address.x City.x State.x Country.x PostalCode.x Phone.x Fax.x Email.x FirstName.y LastName.y Company Address.y City.y State.y Country.y PostalCode.y Phone.y Fax.y Email.y SupportRepId
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 3
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322 Leonie Köhler NA Theodor-Heuss-Straße 34 Stuttgart NA Germany 70174 +49 0711 2842222 NA 5
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712 François Tremblay NA 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 NA 3
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289 Bjørn Hansen NA Ullevålsveien 14 Oslo NA Norway 0171 +47 22 44 22 22 NA 4
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543 František Wichterlová JetBrains s.r.o. Klanova 9/506 Prague NA Czech Republic 14700 +420 2 4172 5555 +420 2 4172 5555 4
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899 Helena Holý NA Rilská 3174/6 Prague NA Czech Republic 14300 +420 2 4177 0449 NA 5

Untuk memperlihatkan bahwa fungsi inner_join() mengacu pada irisan baris untuk kedua tabel yang bersesuaian primary key, perhatikan banyaknya baris pada masing-masing tabel sebagai berikut.

tally(employees)
n
8
tally(customers)
n
59
tally(inner_join)
n
8

Perhatikan bahwa banyaknya baris pada hasil penggabungan tabel secara inner_join adalah sama dengan tabel dengan jumlah baris paling sedikit, yaitu employees.

B. Fungsi left_join()

Fungsi left_join() menghasilkan semua baris pada table x, dan semua kolom pada x dan y, dimana untuk baris pada x yang tidak memiliki kesamaan dengan y diisi dengan nilai NA pada kolom yang baru.

Sama halnya dengan tabel yang digunakan sebelumnya, berikut ditampilkan hasil penggabungan secara left_join data pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

left_join <- employees %>% left_join(customers, by=c("EmployeeId"="CustomerId"))
head(left_join)
EmployeeId LastName.x FirstName.x Title ReportsTo BirthDate HireDate Address.x City.x State.x Country.x PostalCode.x Phone.x Fax.x Email.x FirstName.y LastName.y Company Address.y City.y State.y Country.y PostalCode.y Phone.y Fax.y Email.y SupportRepId
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 3
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322 Leonie Köhler NA Theodor-Heuss-Straße 34 Stuttgart NA Germany 70174 +49 0711 2842222 NA 5
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712 François Tremblay NA 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 NA 3
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289 Bjørn Hansen NA Ullevålsveien 14 Oslo NA Norway 0171 +47 22 44 22 22 NA 4
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543 František Wichterlová JetBrains s.r.o. Klanova 9/506 Prague NA Czech Republic 14700 +420 2 4172 5555 +420 2 4172 5555 4
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899 Helena Holý NA Rilská 3174/6 Prague NA Czech Republic 14300 +420 2 4177 0449 NA 5

Untuk memperlihatkan bahwa fungsi left_join() mengacu pada tabel pertama, dalam hal ini adalah tabel employees, perhatikan banyaknya baris pada tabel hasil left_join berikut.

tally(left_join)
n
8

Perhatikan bahwa banyaknya baris pada hasil penggabungan tabel secara left_join adalah sama dengan tabel acuannya, yaitu employees.

C. Fungsi right_join()

Fungsi right_join() menghasilkan semua baris pada table y, dan semua kolom pada x dan y, dimana untuk baris pada y yang tidak memiliki kesamaan dengan x akan diisi dengan nilai NA pada kolom yang baru.

Berikut ditampilkan hasil penggabungan secara right_join data pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

right_join <- employees %>% right_join(customers, by=c("EmployeeId"="CustomerId"))
head(right_join)
EmployeeId LastName.x FirstName.x Title ReportsTo BirthDate HireDate Address.x City.x State.x Country.x PostalCode.x Phone.x Fax.x Email.x FirstName.y LastName.y Company Address.y City.y State.y Country.y PostalCode.y Phone.y Fax.y Email.y SupportRepId
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 3
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322 Leonie Köhler NA Theodor-Heuss-Straße 34 Stuttgart NA Germany 70174 +49 0711 2842222 NA 5
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712 François Tremblay NA 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 NA 3
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289 Bjørn Hansen NA Ullevålsveien 14 Oslo NA Norway 0171 +47 22 44 22 22 NA 4
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543 František Wichterlová JetBrains s.r.o. Klanova 9/506 Prague NA Czech Republic 14700 +420 2 4172 5555 +420 2 4172 5555 4
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899 Helena Holý NA Rilská 3174/6 Prague NA Czech Republic 14300 +420 2 4177 0449 NA 5

Untuk memperlihatkan bahwa fungsi right_join() mengacu pada tabel kedua, dalam hal ini adalah tabel customers, perhatikan banyaknya baris pada tabel hasil penggabungan secara right_jon berikut.

tally(right_join)
n
59

Perhatikan bahwa banyaknya baris pada hasil penggabungan tabel secara right_join adalah sama dengan tabel acuannya, yaitu customers.

D. Fungsi full_join()

Fungsi full_join() menghasilkan semua baris dan kolom dari x dan y. Jika ada nilai yang tidak sama (match) antara x dan y, maka akan bernilai NA.

Berikut ditampilkan hasil penggabungan secara full_join data pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

full_join <- employees %>% full_join(customers, by=c("EmployeeId"="CustomerId"))
head(full_join)
EmployeeId LastName.x FirstName.x Title ReportsTo BirthDate HireDate Address.x City.x State.x Country.x PostalCode.x Phone.x Fax.x Email.x FirstName.y LastName.y Company Address.y City.y State.y Country.y PostalCode.y Phone.y Fax.y Email.y SupportRepId
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 3
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322 Leonie Köhler NA Theodor-Heuss-Straße 34 Stuttgart NA Germany 70174 +49 0711 2842222 NA 5
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712 François Tremblay NA 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 NA 3
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289 Bjørn Hansen NA Ullevålsveien 14 Oslo NA Norway 0171 +47 22 44 22 22 NA 4
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543 František Wichterlová JetBrains s.r.o. Klanova 9/506 Prague NA Czech Republic 14700 +420 2 4172 5555 +420 2 4172 5555 4
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899 Helena Holý NA Rilská 3174/6 Prague NA Czech Republic 14300 +420 2 4177 0449 NA 5

Untuk memperlihatkan bahwa fungsi full_join() mengacu pada tabel dengan jumlah baris terbanyak, dalam hal ini adalah tabel customers, perhatikan banyaknya baris pada tabel hasil penggabungan secara full_jon berikut.

tally(full_join)
n
59

Perhatikan bahwa banyaknya baris pada hasil penggabungan tabel secara full_join adalah sama dengan tabel dengan jumlah baris terbanyak, yaitu customers.

E. Fungsi semi_join()

Empat fungsi join sebelumnya, yaitu inner_join, left_join, right_join, dan full_join disebut dengan mutating join, yang menggabungkan variabel dari dua sumber data. Sedangkan, dua fungsi join berikutnya, yaitu semi_join dan anti_join disebut dengan filtering joins, yaitu menyimpan kasus dari tabel data kiri (yaitu data-X) dan menggunakan data yang benar (yaitu data-Y) sebagai filter.

Fungsi semi_join() mengembalikan semua baris dari x di mana ada nilai yang cocok di x, dan hanya menjaga kolom dari x. Fungsi semi_join() berbeda dari inner_join() karena inner_join akan mengembalikan satu baris x untuk setiap baris y yang cocok, sedangkan semi_join tidak akan pernah menduplikasi baris x.

Dengan menggunakan tabel yang sama pada contoh sebelumnya, berikut ditampilkan hasil penggabungan data secara semi_join pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

semi_join <- employees %>% semi_join(customers, by=c("EmployeeId"="CustomerId"))
head(semi_join)
EmployeeId LastName FirstName Title ReportsTo BirthDate HireDate Address City State Country PostalCode Phone Fax Email
1 Adams Andrew General Manager NA 1962-02-18 00:00:00 2002-08-14 00:00:00 11120 Jasper Ave NW Edmonton AB Canada T5K 2N1 +1 (780) 428-9482 +1 (780) 428-3457
2 Edwards Nancy Sales Manager 1 1958-12-08 00:00:00 2002-05-01 00:00:00 825 8 Ave SW Calgary AB Canada T2P 2T3 +1 (403) 262-3443 +1 (403) 262-3322
3 Peacock Jane Sales Support Agent 2 1973-08-29 00:00:00 2002-04-01 00:00:00 1111 6 Ave SW Calgary AB Canada T2P 5M5 +1 (403) 262-3443 +1 (403) 262-6712
4 Park Margaret Sales Support Agent 2 1947-09-19 00:00:00 2003-05-03 00:00:00 683 10 Street SW Calgary AB Canada T2P 5G3 +1 (403) 263-4423 +1 (403) 263-4289
5 Johnson Steve Sales Support Agent 2 1965-03-03 00:00:00 2003-10-17 00:00:00 7727B 41 Ave Calgary AB Canada T3B 1Y7 1 (780) 836-9987 1 (780) 836-9543
6 Mitchell Michael IT Manager 1 1973-07-01 00:00:00 2003-10-17 00:00:00 5827 Bowness Road NW Calgary AB Canada T3B 0C5 +1 (403) 246-9887 +1 (403) 246-9899

Perhatikan bahwa jumlah baris dan kolom pada tabel hasil penggabungan secara semi_join sama dengan jumlah baris dan kolom pada tabel x “employees”, sedangkan pada inner_join, jumlah kolomnya merupakan penggabungan dari jumlah kolom pada tabel x “employees” dan tabel y “customers”.

F. Fungsi anti_join()

Fungsi anti_join() hanya menyimpan baris yang tidak ada di data sebelah kanan DAN hanya menyimpan kolom di data sebelah kiri. Fungsi anti_join mengembalikan semua baris dari x di mana tidak ada nilai yang cocok di y dan mempertahankan hanya kolom dari x. Berikut gambar ilustrasi dari fungs anti_join().

Masih dengan tabel yang sama pada contoh sebelumnya, berikut ditampilkan hasil penggabungan data secara anti_join pada Tabel “employees” dan Tabel “customers”, dengan identitas kolom yang dianggap sama (primary key), yaitu EmployeeId = CustomerId.

anti_join <- employees %>% anti_join(customers, by=c("EmployeeId"="CustomerId"))
head(anti_join)
EmployeeId LastName FirstName Title ReportsTo BirthDate HireDate Address City State Country PostalCode Phone Fax Email

Terlihat dari hasil penggabungan tabel secara anti_join, tidak ada baris yang ditampilkan, hal itu berarti tidak ada nilai dari tabel x yang bukan merupakan irisan dari tabel y, sehingga hanya dapat ditampilkan jumlah kolomnya yang berjumlah 15 (jumlah kolom pada tabel x “employees”.


  1. IPB University-Prodi Statistika dan Sains Data 2021↩︎