Menggabungkan Beberapa Tabel
Menggabungkan Beberapa Tabel dengan dplyr di R
Sebelum jalankan perintah SQL pada R terlebih dahulu lakukan peng-install-an packages jika baru pertama kali penggunakan packages berikut:
Install Packages
#terlebih dahulu install terhadap packages berikut, untuk menjalankan program yang akan dibuat. Peng-install-an dilakukan tanpa menggunakan tagar (#)
#install.packages("tidyverse")
#install.packages("RSQLite")
#install.packages("DBI")
#Selanjutnya panggil packages tersebut
library(tidyverse)## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.3 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(RSQLite)
library(DBI)Import Data
Setelah melakukan peng-install-an dan pemanggilan packages, selanjutnya import data yang diinginkan.
Northwind<-DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/db/Northwind_large.sqlite")
class(Northwind)## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
Selanjutnya, gunakan fungsi dbListTables untuk melihat tables yang terdapat di dalam database.
dbListTables(Northwind)## [1] "Category" "Customer" "CustomerCustomerDemo"
## [4] "CustomerDemographic" "Employee" "EmployeeTerritory"
## [7] "Order" "OrderDetail" "Product"
## [10] "ProductDetails_V" "Region" "Shipper"
## [13] "Supplier" "Territory"
Inner Join
Inner join digunakan untuk menghasilkan semua baris pada table x yang memiliki kesamaan nilai dengan table y, dan semua kolom dari x dan y.
#cara 1
inner_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 2 x 3
## name band plays
## <chr> <chr> <chr>
## 1 John Beatles guitar
## 2 Paul Beatles bass
#cara 2
band_members %>%
inner_join(band_instruments)## Joining, by = "name"
## # A tibble: 2 x 3
## name band plays
## <chr> <chr> <chr>
## 1 John Beatles guitar
## 2 Paul Beatles bass
Left Join
Left join digunakan untuk 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.
#cara 1
left_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 3 x 3
## name band plays
## <chr> <chr> <chr>
## 1 Mick Stones <NA>
## 2 John Beatles guitar
## 3 Paul Beatles bass
#cara 2
band_members %>%
left_join(band_instruments)## Joining, by = "name"
## # A tibble: 3 x 3
## name band plays
## <chr> <chr> <chr>
## 1 Mick Stones <NA>
## 2 John Beatles guitar
## 3 Paul Beatles bass
Right Join
Right join digunakan untuk 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.
#cara 1
right_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 3 x 3
## name band plays
## <chr> <chr> <chr>
## 1 John Beatles guitar
## 2 Paul Beatles bass
## 3 Keith <NA> guitar
#cara 2
band_members %>%
right_join(band_instruments)## Joining, by = "name"
## # A tibble: 3 x 3
## name band plays
## <chr> <chr> <chr>
## 1 John Beatles guitar
## 2 Paul Beatles bass
## 3 Keith <NA> guitar
Full Join
Full join digunakan untuk menghasilkan semua baris dan kolom dari x dan y. Jika ada nilai yang tidak sama (match) antara x dan y, maka akan bernilai NA.
#cara 1
full_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 4 x 3
## name band plays
## <chr> <chr> <chr>
## 1 Mick Stones <NA>
## 2 John Beatles guitar
## 3 Paul Beatles bass
## 4 Keith <NA> guitar
#cara 2
band_members %>%
full_join(band_instruments)## Joining, by = "name"
## # A tibble: 4 x 3
## name band plays
## <chr> <chr> <chr>
## 1 Mick Stones <NA>
## 2 John Beatles guitar
## 3 Paul Beatles bass
## 4 Keith <NA> guitar
Semi Join
Semi join digunakan untuk menghasilkan semua baris pada table x yang memiliki kesamaan nilai dengan table y, dan semua kolom dari x. Ini mirip dengan inner_join(), bedanya inner_join() mengembalikan semua kolom dari x dan y. Untuk melakukan semi join terdapat dua cara yaitu
#cara 1
semi_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 2 x 2
## name band
## <chr> <chr>
## 1 John Beatles
## 2 Paul Beatles
#cara 2
band_members %>%
semi_join(band_instruments)## Joining, by = "name"
## # A tibble: 2 x 2
## name band
## <chr> <chr>
## 1 John Beatles
## 2 Paul Beatles
Anti Join
Anti join digunakan untuk menghasilkan semua baris dari x yang TIDAK memiliki kesamaan dengan y, dan semua kolom yang berasal dari x.
#cara 1
anti_join(band_members,band_instruments)## Joining, by = "name"
## # A tibble: 1 x 2
## name band
## <chr> <chr>
## 1 Mick Stones
#cara 2
band_members %>%
anti_join(band_instruments)## Joining, by = "name"
## # A tibble: 1 x 2
## name band
## <chr> <chr>
## 1 Mick Stones
Menggabungkan Beberapa Tabel dengan SQL
Package rmarkdown memfasilitasi penggunaan SQL engine, untuk mengeksekusi syntax SQL dan menampilkan hasilnya.Untuk menggunakannya, kita harus membuat connection terlebih dahulu yang digunakan secara bersamaan dengan engine sql.Berikut ini adalah proses membentuk suatu object db yang merupakan class SQLiteConnection
db <- DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/db/chinook.db")
class(db)## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
Object db ini digunakan pada opsi connection, kemudian pada opsi engine digunakan “sql”. Sehingga di dalamnya kita bisa menulis syntax SQL.
| TrackId | Name | AlbumId | MediaTypeId | GenreId | Composer | Milliseconds | Bytes | UnitPrice |
|---|---|---|---|---|---|---|---|---|
| 1 | For Those About To Rock (We Salute You) | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 343719 | 11170334 | 0.99 |
| 2 | Balls to the Wall | 2 | 2 | 1 | NA | 342562 | 5510424 | 0.99 |
| 3 | Fast As a Shark | 3 | 2 | 1 | F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman | 230619 | 3990994 | 0.99 |
| 4 | Restless and Wild | 3 | 2 | 1 | F. Baltes, R.A. Smith-Diesel, S. Kaufman, U. Dirkscneider & W. Hoffman | 252051 | 4331779 | 0.99 |
| 5 | Princess of the Dawn | 3 | 2 | 1 | Deaffy & R.A. Smith-Diesel | 375418 | 6290521 | 0.99 |
| 6 | Put The Finger On You | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 205662 | 6713451 | 0.99 |
| 7 | Let’s Get It Up | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 233926 | 7636561 | 0.99 |
| 8 | Inject The Venom | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 210834 | 6852860 | 0.99 |
| 9 | Snowballed | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 203102 | 6599424 | 0.99 |
| 10 | Evil Walks | 1 | 1 | 1 | Angus Young, Malcolm Young, Brian Johnson | 263497 | 8611245 | 0.99 |
Pada bagian ini, kita akan menggabungkan tabel dari database chinook.db. Tabel yang akan digabung yaitu tabel artist dan tabel albumn.
SQLite Inner Join
Syntax berikut menampilkan kolom Title dari tabel albums dan name dari tabel artists. Dan menggabungkan kolom ArtisId yang ada pada tabel artist dan albums.
SELECT
Title,
Name
FROM
albums
INNER JOIN
artists
ON artists.ArtistId = albums.ArtistId;| Title | Name |
|---|---|
| For Those About To Rock We Salute You | AC/DC |
| Balls to the Wall | Accept |
| Restless and Wild | Accept |
| Let There Be Rock | AC/DC |
| Big Ones | Aerosmith |
| Jagged Little Pill | Alanis Morissette |
| Facelift | Alice In Chains |
| Warner 25 Anos | Antônio Carlos Jobim |
| Plays Metallica By Four Cellos | Apocalyptica |
| Audioslave | Audioslave |
Karena nama kolom ArtistID sama antara tabel artists dan albums maka Anda bisa menggunakan USING
SELECT
Title,
Name
FROM
albums
INNER JOIN
artists
USING(ArtistId);| Title | Name |
|---|---|
| For Those About To Rock We Salute You | AC/DC |
| Balls to the Wall | Accept |
| Restless and Wild | Accept |
| Let There Be Rock | AC/DC |
| Big Ones | Aerosmith |
| Jagged Little Pill | Alanis Morissette |
| Facelift | Alice In Chains |
| Warner 25 Anos | Antônio Carlos Jobim |
| Plays Metallica By Four Cellos | Apocalyptica |
| Audioslave | Audioslave |
Contoh Inner Join untuk 3 tabel
SELECT
trackid,
tracks.name AS track,
albums.title AS album,
artists.name AS artist
FROM
tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = albums.artistid;| TrackId | track | album | artist |
|---|---|---|---|
| 1 | For Those About To Rock (We Salute You) | For Those About To Rock We Salute You | AC/DC |
| 6 | Put The Finger On You | For Those About To Rock We Salute You | AC/DC |
| 7 | Let’s Get It Up | For Those About To Rock We Salute You | AC/DC |
| 8 | Inject The Venom | For Those About To Rock We Salute You | AC/DC |
| 9 | Snowballed | For Those About To Rock We Salute You | AC/DC |
| 10 | Evil Walks | For Those About To Rock We Salute You | AC/DC |
| 11 | C.O.D. | For Those About To Rock We Salute You | AC/DC |
| 12 | Breaking The Rules | For Those About To Rock We Salute You | AC/DC |
| 13 | Night Of The Long Knives | For Those About To Rock We Salute You | AC/DC |
| 14 | Spellbound | For Those About To Rock We Salute You | AC/DC |
SQLite Left Join
Syntax berikut menampilkan kolom nama dan title dengan menampilkan semua data pada kolom ArtistId yang ada pada tabel artists dan data pada kolom ArtistId yang sama dengan tabel artist yang terdapat pada tabel albums.
SELECT Name,Title
FROM artists LEFT JOIN albums
USING (ArtistId)
ORDER BY Name;| Name | Title |
|---|---|
| A Cor Do Som | NA |
| AC/DC | For Those About To Rock We Salute You |
| AC/DC | Let There Be Rock |
| Aaron Copland & London Symphony Orchestra | A Copland Celebration, Vol. I |
| Aaron Goldberg | Worlds |
| Academy of St. Martin in the Fields & Sir Neville Marriner | The World of Classical Favourites |
| Academy of St. Martin in the Fields Chamber Ensemble & Sir Neville Marriner | Sir Neville Marriner: A Celebration |
| Academy of St. Martin in the Fields, John Birch, Sir Neville Marriner & Sylvia McNair | Fauré: Requiem, Ravel: Pavane & Others |
| Academy of St. Martin in the Fields, Sir Neville Marriner & Thurston Dart | Bach: Orchestral Suites Nos. 1 - 4 |
| Academy of St. Martin in the Fields, Sir Neville Marriner & William Bennett | NA |
Demikianlah cara untuk menggabungkan tabel pada R dengan menggunakan package dplyr dan SQLite jika menggunakan rmarkdown.