Database in R

Dalam analisis data modern, kemampuan untuk terhubung dan mengelola database relasional merupakan keterampilan penting. R menyediakan berbagai paket yang memungkinkan pengguna untuk berinteraksi dengan berbagai sistem manajemen basis data (DBMS) seperti SQLite, MySQL, PostgreSQL, dan lainnya melalui antarmuka yang konsisten. Dokumen ini akan membahas langkah-langkah koneksi database di R, perbedaan antara fungsi pengambilan data, serta teknik penggabungan tabel menggunakan sintaks dplyr dan SQL.

Paket R untuk Koneksi Database

Berikut adalah beberapa paket R yang umum digunakan untuk koneksi dan manipulasi database:

  • DBI: Antarmuka umum untuk operasi database di R.

  • RSQLite: Khusus untuk database SQLite.

  • RMysQL: Untuk database MySQL.

  • RPostgres: Untuk PostgreSQL.

  • odbc: Untuk database yang mendukung ODBC.

  • dplyr & dbplyr: Mengonversi sintaks dplyr menjadi kueri SQL.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.1
## Warning: package 'ggplot2' was built under R version 4.5.2
## Warning: package 'tibble' was built under R version 4.5.1
## Warning: package 'tidyr' was built under R version 4.5.2
## Warning: package 'readr' was built under R version 4.5.1
## Warning: package 'purrr' was built under R version 4.5.1
## Warning: package 'dplyr' was built under R version 4.5.1
## Warning: package 'forcats' was built under R version 4.5.1
## Warning: package 'lubridate' was built under R version 4.5.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 4.5.1
library(DBI)
## Warning: package 'DBI' was built under R version 4.5.1

Langkah-Langkah Koneksi Database di R

Proses koneksi ke database dari R mengikuti alur berikut:

  1. Panggil paket DBI:

    library(DBI)
  2. Panggil paket driver database (misal RSQLite):

    library(RSQLite)
  3. Buka koneksi dengan dbConnect():

    con <- dbConnect(SQLite(), "C:\\Users\\Legion\\Documents\\Asisten Dosen\\Sains Data\\P3-Pengolahan-Database-dan-Data-Spasial-Menggunakan-R\\Chinook_Sqlite.sqlite")
  4. Cek tabel yang tersedia dengan dbListTables():

    dbListTables(con)
    ##  [1] "Album"         "Artist"        "Customer"      "Employee"     
    ##  [5] "Genre"         "Invoice"       "InvoiceLine"   "MediaType"    
    ##  [9] "Playlist"      "PlaylistTrack" "Track"
  5. Jalankan kueri SQL dengan dbGetQuery() atau dbSendQuery().

  6. Tutup koneksi setelah selesai:

    dbDisconnect(con)

Koneksi ke SQLite: Studi Kasus Chinook Database

Database Chinook digunakan sebagai contoh. Berikut langkah-langkahnya:

# Koneksi ke database 
chinook <- dbConnect(SQLite(), "C:\\Users\\Legion\\Documents\\Asisten Dosen\\Sains Data\\P3-Pengolahan-Database-dan-Data-Spasial-Menggunakan-R\\Chinook_Sqlite.sqlite")  
# Lihat tabel yang ada 
dbListTables(chinook)  
##  [1] "Album"         "Artist"        "Customer"      "Employee"     
##  [5] "Genre"         "Invoice"       "InvoiceLine"   "MediaType"    
##  [9] "Playlist"      "PlaylistTrack" "Track"
# Akses tabel Customer 
customer <- tbl(src = chinook, "Customer") 
glimpse(customer)
## Rows: ??
## Columns: 13
## Database: sqlite 3.50.4 [C:\Users\Legion\Documents\Asisten Dosen\Sains Data\P3-Pengolahan-Database-dan-Data-Spasial-Menggunakan-R\Chinook_Sqlite.sqlite]
## $ CustomerId   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
## $ FirstName    <chr> "Luís", "Leonie", "François", "Bjørn", "František", "Hele…
## $ LastName     <chr> "Gonçalves", "Köhler", "Tremblay", "Hansen", "Wichterlová…
## $ Company      <chr> "Embraer - Empresa Brasileira de Aeronáutica S.A.", NA, N…
## $ Address      <chr> "Av. Brigadeiro Faria Lima, 2170", "Theodor-Heuss-Straße …
## $ City         <chr> "São José dos Campos", "Stuttgart", "Montréal", "Oslo", "…
## $ State        <chr> "SP", NA, "QC", NA, NA, NA, NA, NA, NA, "SP", "SP", "RJ",…
## $ Country      <chr> "Brazil", "Germany", "Canada", "Norway", "Czech Republic"…
## $ PostalCode   <chr> "12227-000", "70174", "H2G 1A7", "0171", "14700", "14300"…
## $ Phone        <chr> "+55 (12) 3923-5555", "+49 0711 2842222", "+1 (514) 721-4…
## $ Fax          <chr> "+55 (12) 3923-5566", NA, NA, NA, "+420 2 4172 5555", NA,…
## $ Email        <chr> "luisg@embraer.com.br", "leonekohler@surfeu.de", "ftrembl…
## $ SupportRepId <int> 3, 5, 3, 4, 4, 5, 5, 4, 4, 4, 5, 3, 4, 5, 3, 4, 5, 3, 3, …

Catatan: Objek tbl hanya terhubung ke database, tidak disimpan sepenuhnya di memori R. Ini menghemat RAM untuk dataset besar.

Perbandingan dbGetQuery() dan dbSendQuery()

Aspek dbGetQuery() dbSendQuery()
Tujuan Mengeksekusi kueri dan langsung mengambil hasil sebagai data.frame. Mengirim kueri tanpa langsung mengambil hasil.
Manajemen Memori Semua hasil dimuat sekaligus ke RAM. Data dapat diambil bertahap dengan dbFetch().
Pembersihan Otomatis. Harus dibersihkan manual dengan dbClearResult().

Contoh dbGetQuery():

employee <- dbGetQuery(chinook, "SELECT * FROM Employee")
str(employee)
## 'data.frame':    8 obs. of  15 variables:
##  $ EmployeeId: int  1 2 3 4 5 6 7 8
##  $ LastName  : chr  "Adams" "Edwards" "Peacock" "Park" ...
##  $ FirstName : chr  "Andrew" "Nancy" "Jane" "Margaret" ...
##  $ Title     : chr  "General Manager" "Sales Manager" "Sales Support Agent" "Sales Support Agent" ...
##  $ ReportsTo : int  NA 1 2 2 2 1 6 6
##  $ BirthDate : chr  "1962-02-18 00:00:00" "1958-12-08 00:00:00" "1973-08-29 00:00:00" "1947-09-19 00:00:00" ...
##  $ HireDate  : chr  "2002-08-14 00:00:00" "2002-05-01 00:00:00" "2002-04-01 00:00:00" "2003-05-03 00:00:00" ...
##  $ Address   : chr  "11120 Jasper Ave NW" "825 8 Ave SW" "1111 6 Ave SW" "683 10 Street SW" ...
##  $ City      : chr  "Edmonton" "Calgary" "Calgary" "Calgary" ...
##  $ State     : chr  "AB" "AB" "AB" "AB" ...
##  $ Country   : chr  "Canada" "Canada" "Canada" "Canada" ...
##  $ PostalCode: chr  "T5K 2N1" "T2P 2T3" "T2P 5M5" "T2P 5G3" ...
##  $ Phone     : chr  "+1 (780) 428-9482" "+1 (403) 262-3443" "+1 (403) 262-3443" "+1 (403) 263-4423" ...
##  $ Fax       : chr  "+1 (780) 428-3457" "+1 (403) 262-3322" "+1 (403) 262-6712" "+1 (403) 263-4289" ...
##  $ Email     : chr  "andrew@chinookcorp.com" "nancy@chinookcorp.com" "jane@chinookcorp.com" "margaret@chinookcorp.com" ...

Contoh dbSendQuery():

query <- dbSendQuery(chinook, "SELECT * FROM Customer")
while (!dbHasCompleted(query)) {
  chunk <- dbFetch(query, n = 10)
  print(chunk)
}
##    CustomerId FirstName    LastName
## 1           1      Luís   Gonçalves
## 2           2    Leonie      Köhler
## 3           3  François    Tremblay
## 4           4     Bjørn      Hansen
## 5           5 František Wichterlová
## 6           6    Helena        Holý
## 7           7    Astrid      Gruber
## 8           8      Daan     Peeters
## 9           9      Kara     Nielsen
## 10         10   Eduardo     Martins
##                                             Company
## 1  Embraer - Empresa Brasileira de Aeronáutica S.A.
## 2                                              <NA>
## 3                                              <NA>
## 4                                              <NA>
## 5                                  JetBrains s.r.o.
## 6                                              <NA>
## 7                                              <NA>
## 8                                              <NA>
## 9                                              <NA>
## 10                                 Woodstock Discos
##                                 Address                City State
## 1       Av. Brigadeiro Faria Lima, 2170 São José dos Campos    SP
## 2               Theodor-Heuss-Straße 34           Stuttgart  <NA>
## 3                     1498 rue Bélanger            Montréal    QC
## 4                      Ullevålsveien 14                Oslo  <NA>
## 5                         Klanova 9/506              Prague  <NA>
## 6                         Rilská 3174/6              Prague  <NA>
## 7  Rotenturmstraße 4, 1010 Innere Stadt              Vienne  <NA>
## 8                       Grétrystraat 63            Brussels  <NA>
## 9                   Sønder Boulevard 51          Copenhagen  <NA>
## 10            Rua Dr. Falcão Filho, 155           São Paulo    SP
##           Country PostalCode              Phone                Fax
## 1          Brazil  12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566
## 2         Germany      70174   +49 0711 2842222               <NA>
## 3          Canada    H2G 1A7  +1 (514) 721-4711               <NA>
## 4          Norway       0171    +47 22 44 22 22               <NA>
## 5  Czech Republic      14700   +420 2 4172 5555   +420 2 4172 5555
## 6  Czech Republic      14300   +420 2 4177 0449               <NA>
## 7         Austria       1010     +43 01 5134505               <NA>
## 8         Belgium       1000   +32 02 219 03 03               <NA>
## 9         Denmark       1720     +453 3331 9991               <NA>
## 10         Brazil  01007-010 +55 (11) 3033-5446 +55 (11) 3033-4564
##                       Email SupportRepId
## 1      luisg@embraer.com.br            3
## 2     leonekohler@surfeu.de            5
## 3       ftremblay@gmail.com            3
## 4     bjorn.hansen@yahoo.no            4
## 5  frantisekw@jetbrains.com            4
## 6           hholy@gmail.com            5
## 7    astrid.gruber@apple.at            5
## 8     daan_peeters@apple.be            4
## 9     kara.nielsen@jubii.dk            4
## 10 eduardo@woodstock.com.br            4
##    CustomerId FirstName LastName               Company
## 1          11 Alexandre    Rocha  Banco do Brasil S.A.
## 2          12   Roberto  Almeida                Riotur
## 3          13  Fernanda    Ramos                  <NA>
## 4          14      Mark  Philips                 Telus
## 5          15  Jennifer Peterson         Rogers Canada
## 6          16     Frank   Harris           Google Inc.
## 7          17      Jack    Smith Microsoft Corporation
## 8          18  Michelle   Brooks                  <NA>
## 9          19       Tim    Goyer            Apple Inc.
## 10         20       Dan   Miller                  <NA>
##                      Address           City State Country PostalCode
## 1         Av. Paulista, 2022      São Paulo    SP  Brazil  01310-200
## 2           Praça Pio X, 119 Rio de Janeiro    RJ  Brazil  20040-020
## 3               Qe 7 Bloco G       Brasília    DF  Brazil  71020-677
## 4             8210 111 ST NW       Edmonton    AB  Canada    T6G 2C7
## 5        700 W Pender Street      Vancouver    BC  Canada    V6C 1G8
## 6  1600 Amphitheatre Parkway  Mountain View    CA     USA 94043-1351
## 7            1 Microsoft Way        Redmond    WA     USA 98052-8300
## 8               627 Broadway       New York    NY     USA 10012-2612
## 9            1 Infinite Loop      Cupertino    CA     USA      95014
## 10      541 Del Medio Avenue  Mountain View    CA     USA  94040-111
##                 Phone                Fax                         Email
## 1  +55 (11) 3055-3278 +55 (11) 3055-8131              alero@uol.com.br
## 2  +55 (21) 2271-7000 +55 (21) 2271-7070 roberto.almeida@riotur.gov.br
## 3  +55 (61) 3363-5547 +55 (61) 3363-7855      fernadaramos4@uol.com.br
## 4   +1 (780) 434-4554  +1 (780) 434-5565            mphilips12@shaw.ca
## 5   +1 (604) 688-2255  +1 (604) 688-8756           jenniferp@rogers.ca
## 6   +1 (650) 253-0000  +1 (650) 253-0000            fharris@google.com
## 7   +1 (425) 882-8080  +1 (425) 882-8081       jacksmith@microsoft.com
## 8   +1 (212) 221-3546  +1 (212) 221-4679             michelleb@aol.com
## 9   +1 (408) 996-1010  +1 (408) 996-1011              tgoyer@apple.com
## 10  +1 (650) 644-3358               <NA>           dmiller@comcast.com
##    SupportRepId
## 1             5
## 2             3
## 3             4
## 4             5
## 5             3
## 6             4
## 7             5
## 8             3
## 9             3
## 10            4
##    CustomerId FirstName   LastName Company                Address
## 1          21     Kathy      Chase    <NA>       801 W 4th Street
## 2          22   Heather    Leacock    <NA>       120 S Orange Ave
## 3          23      John     Gordon    <NA>        69 Salem Street
## 4          24     Frank    Ralston    <NA>  162 E Superior Street
## 5          25    Victor    Stevens    <NA>  319 N. Frances Street
## 6          26   Richard Cunningham    <NA>    2211 W Berry Street
## 7          27   Patrick       Gray    <NA>        1033 N Park Ave
## 8          28     Julia    Barnett    <NA>            302 S 700 E
## 9          29    Robert      Brown    <NA> 796 Dundas Street West
## 10         30    Edward    Francis    <NA>       230 Elgin Street
##              City State Country PostalCode             Phone  Fax
## 1            Reno    NV     USA      89503 +1 (775) 223-7665 <NA>
## 2         Orlando    FL     USA      32801 +1 (407) 999-7788 <NA>
## 3          Boston    MA     USA       2113 +1 (617) 522-1333 <NA>
## 4         Chicago    IL     USA      60611 +1 (312) 332-3232 <NA>
## 5         Madison    WI     USA      53703 +1 (608) 257-0597 <NA>
## 6      Fort Worth    TX     USA      76110 +1 (817) 924-7272 <NA>
## 7          Tucson    AZ     USA      85719 +1 (520) 622-4200 <NA>
## 8  Salt Lake City    UT     USA      84102 +1 (801) 531-7272 <NA>
## 9         Toronto    ON  Canada    M6J 1V1 +1 (416) 363-8888 <NA>
## 10         Ottawa    ON  Canada    K2P 1L7 +1 (613) 234-3322 <NA>
##                       Email SupportRepId
## 1       kachase@hotmail.com            5
## 2        hleacock@gmail.com            4
## 3    johngordon22@yahoo.com            4
## 4        fralston@gmail.com            3
## 5        vstevens@yahoo.com            5
## 6  ricunningham@hotmail.com            4
## 7      patrick.gray@aol.com            4
## 8       jubarnett@gmail.com            5
## 9          robbrown@shaw.ca            3
## 10      edfrancis@yachoo.ca            3
##    CustomerId FirstName   LastName Company
## 1          31    Martha       Silk    <NA>
## 2          32     Aaron   Mitchell    <NA>
## 3          33     Ellie   Sullivan    <NA>
## 4          34      João  Fernandes    <NA>
## 5          35  Madalena    Sampaio    <NA>
## 6          36    Hannah  Schneider    <NA>
## 7          37      Fynn Zimmermann    <NA>
## 8          38    Niklas   Schröder    <NA>
## 9          39   Camille    Bernard    <NA>
## 10         40 Dominique   Lefebvre    <NA>
##                                     Address        City State  Country
## 1                     194A Chain Lake Drive     Halifax    NS   Canada
## 2                        696 Osborne Street    Winnipeg    MB   Canada
## 3                            5112 48 Street Yellowknife    NT   Canada
## 4                        Rua da Assunção 53      Lisbon  <NA> Portugal
## 5  Rua dos Campeões Europeus de Viena, 4350       Porto  <NA> Portugal
## 6                        Tauentzienstraße 8      Berlin  <NA>  Germany
## 7                          Berger Straße 10   Frankfurt  <NA>  Germany
## 8                       Barbarossastraße 19      Berlin  <NA>  Germany
## 9                             4, Rue Milton       Paris  <NA>   France
## 10                           8, Rue Hanovre       Paris  <NA>   France
##    PostalCode              Phone  Fax                       Email SupportRepId
## 1     B3S 1C5  +1 (902) 450-0450 <NA>        marthasilk@gmail.com            5
## 2     R3L 2B9  +1 (204) 452-6452 <NA>      aaronmitchell@yahoo.ca            4
## 3     X1A 1N6  +1 (867) 920-2233 <NA>      ellie.sullivan@shaw.ca            3
## 4        <NA> +351 (213) 466-111 <NA>         jfernandes@yahoo.pt            4
## 5        <NA> +351 (225) 022-448 <NA>           masampaio@sapo.pt            4
## 6       10789   +49 030 26550280 <NA>   hannah.schneider@yahoo.de            5
## 7       60316   +49 069 40598889 <NA>        fzimmermann@yahoo.de            3
## 8       10779    +49 030 2141444 <NA>         nschroder@surfeu.de            3
## 9       75009 +33 01 49 70 65 65 <NA>    camille.bernard@yahoo.fr            4
## 10      75002 +33 01 47 42 71 71 <NA> dominiquelefebvre@gmail.com            4
##    CustomerId FirstName     LastName Company                Address      City
## 1          41      Marc       Dubois    <NA>    11, Place Bellecour      Lyon
## 2          42     Wyatt       Girard    <NA> 9, Place Louis Barthou  Bordeaux
## 3          43  Isabelle      Mercier    <NA>       68, Rue Jouvence     Dijon
## 4          44     Terhi   Hämäläinen    <NA>        Porthaninkatu 9  Helsinki
## 5          45  Ladislav       Kovács    <NA>      Erzsébet krt. 58.  Budapest
## 6          46      Hugh     O'Reilly    <NA>       3 Chatham Street    Dublin
## 7          47     Lucas      Mancini    <NA> Via Degli Scipioni, 43      Rome
## 8          48  Johannes Van der Berg    <NA>  Lijnbaansgracht 120bg Amsterdam
## 9          49 Stanisław       Wójcik    <NA>           Ordynacka 10    Warsaw
## 10         50   Enrique        Muñoz    <NA>     C/ San Bernardo 85    Madrid
##     State     Country PostalCode              Phone  Fax
## 1    <NA>      France      69002 +33 04 78 30 30 30 <NA>
## 2    <NA>      France      33000 +33 05 56 96 96 96 <NA>
## 3    <NA>      France      21000 +33 03 80 73 66 99 <NA>
## 4    <NA>     Finland      00530   +358 09 870 2000 <NA>
## 5    <NA>     Hungary     H-1073               <NA> <NA>
## 6  Dublin     Ireland       <NA>    +353 01 6792424 <NA>
## 7      RM       Italy      00192    +39 06 39733434 <NA>
## 8      VV Netherlands       1016    +31 020 6223130 <NA>
## 9    <NA>      Poland     00-358   +48 22 828 37 39 <NA>
## 10   <NA>       Spain      28015    +34 914 454 454 <NA>
##                        Email SupportRepId
## 1    marc.dubois@hotmail.com            5
## 2      wyatt.girard@yahoo.fr            3
## 3  isabelle_mercier@apple.fr            3
## 4  terhi.hamalainen@apple.fi            3
## 5   ladislav_kovacs@apple.hu            3
## 6       hughoreilly@apple.ie            3
## 7     lucas.mancini@yahoo.it            5
## 8    johavanderberg@yahoo.nl            5
## 9     stanisław.wójcik@wp.pl            4
## 10    enrique_munoz@yahoo.es            5
##   CustomerId FirstName   LastName Company             Address         City
## 1         51    Joakim  Johansson    <NA>         Celsiusg. 9    Stockholm
## 2         52      Emma      Jones    <NA>   202 Hoxton Street       London
## 3         53      Phil     Hughes    <NA>        113 Lupus St       London
## 4         54     Steve     Murray    <NA>      110 Raeburn Pl   Edinburgh 
## 5         55      Mark     Taylor    <NA>   421 Bourke Street       Sidney
## 6         56     Diego  Gutiérrez    <NA>  307 Macacha Güemes Buenos Aires
## 7         57      Luis      Rojas    <NA>     Calle Lira, 198     Santiago
## 8         58     Manoj     Pareek    <NA> 12,Community Centre        Delhi
## 9         59      Puja Srivastava    <NA>   3,Raj Bhavan Road    Bangalore
##   State        Country PostalCode               Phone  Fax
## 1  <NA>         Sweden      11230    +46 08-651 52 52 <NA>
## 2  <NA> United Kingdom     N1 5LH   +44 020 7707 0707 <NA>
## 3  <NA> United Kingdom   SW1V 3EN   +44 020 7976 5722 <NA>
## 4  <NA> United Kingdom    EH4 1HH   +44 0131 315 3300 <NA>
## 5   NSW      Australia       2010  +61 (02) 9332 3633 <NA>
## 6  <NA>      Argentina       1106 +54 (0)11 4311 4333 <NA>
## 7  <NA>          Chile       <NA>   +56 (0)2 635 4444 <NA>
## 8  <NA>          India     110017   +91 0124 39883988 <NA>
## 9  <NA>          India     560001    +91 080 22289999 <NA>
##                       Email SupportRepId
## 1 joakim.johansson@yahoo.se            5
## 2    emma_jones@hotmail.com            3
## 3     phil.hughes@gmail.com            3
## 4     steve.murray@yahoo.uk            5
## 5      mark.taylor@yahoo.au            4
## 6  diego.gutierrez@yahoo.ar            4
## 7        luisrojas@yahoo.cl            5
## 8   manoj.pareek@rediff.com            3
## 9  puja_srivastava@yahoo.in            3
dbClearResult(query)

Membuat Database SQLite di R

Kita dapat membuat database SQLite langsung dari R:

# Buat koneksi ke database baru
con2 <- dbConnect(SQLite(), "mydb.sqlite")

# Gunakan dataset contoh
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.5.2
data("BreastCancer")
names(BreastCancer) <- str_replace_all(names(BreastCancer), "\\.", "__")

# Tulis tabel ke database
dbWriteTable(con2, "BreastCancer", BreastCancer, overwrite = TRUE)

# Cek tabel
dbListTables(con2)
## [1] "BreastCancer"
# Hapus objek dan putus koneksi
rm(BreastCancer)
dbDisconnect(con2)

SQL Query Menggunakan dplyr

Sintaks dplyr dapat diterjemahkan otomatis menjadi SQL:

invoice_country <- tbl(chinook, "Invoice") %>%
  group_by(BillingCountry) %>%
  summarise(mean_invoice = mean(Total))

# Lihat kueri SQL-nya
show_query(invoice_country)
## Warning: Missing values are always removed in SQL aggregation functions.
## Use `na.rm = TRUE` to silence this warning
## This warning is displayed once every 8 hours.
## <SQL>
## SELECT `BillingCountry`, AVG(`Total`) AS `mean_invoice`
## FROM `Invoice`
## GROUP BY `BillingCountry`
# Konversi ke data.frame untuk ditampilkan
invoice_country %>% as.data.frame()

Penggabungan Tabel (Joining)

Penggabungan tabel adalah operasi fundamental dalam database. Berikut jenis-jenis join yang umum:

Jenis-Jenis Join

  1. Inner Join: Hanya baris yang cocok di kedua tabel.

  2. Left Join: Semua baris dari tabel kiri, dan yang cocok dari kanan.

  3. Right Join: Semua baris dari tabel kanan, dan yang cocok dari kiri.

  4. Full Join: Semua baris dari kedua tabel.

  5. Semi Join: Baris dari kiri yang cocok dengan kanan (hanya kolom kiri).

  6. Anti Join: Baris dari kiri yang tidak cocok dengan kanan.

Contoh dengan Data Band

data("band_members", package = "dplyr")
data("band_instruments", package = "dplyr")

# Inner Join
inner_join(band_members, band_instruments, by = "name")
# Left Join
left_join(band_members, band_instruments)
## Joining with `by = join_by(name)`
# Full Join
full_join(band_members, band_instruments)
## Joining with `by = join_by(name)`
# Semi Join
semi_join(band_members, band_instruments)
## Joining with `by = join_by(name)`
# Anti Join
anti_join(band_members, band_instruments)
## Joining with `by = join_by(name)`

Join dengan Kolom Berbeda Nama

data("band_instruments2", package = "dplyr") 
full_join(band_members, band_instruments2, by = c("name" = "artist"))

Join dengan Database

res <- tbl(chinook, "Customer") %>%   
  select(CustomerId, FirstName, LastName, Country) %>%   
  left_join(tbl(chinook, "Invoice") %>% 
              select(CustomerId, Total),             
            by = "CustomerId") 
glimpse(res)
## Rows: ??
## Columns: 5
## Database: sqlite 3.50.4 [C:\Users\Legion\Documents\Asisten Dosen\Sains Data\P3-Pengolahan-Database-dan-Data-Spasial-Menggunakan-R\Chinook_Sqlite.sqlite]
## $ CustomerId <int> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,…
## $ FirstName  <chr> "Luís", "Luís", "Luís", "Luís", "Luís", "Luís", "Luís", "Le…
## $ LastName   <chr> "Gonçalves", "Gonçalves", "Gonçalves", "Gonçalves", "Gonçal…
## $ Country    <chr> "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil",…
## $ Total      <dbl> 3.98, 3.96, 5.94, 0.99, 1.98, 13.86, 8.91, 1.98, 13.86, 8.9…

Dokumen ini telah membahas:

  • Koneksi R ke database SQLite.

  • Penggunaan DBI, RSQLite, dan dplyr untuk manipulasi data.

  • Perbedaan antara dbGetQuery dan dbSendQuery.

  • Teknik penggabungan tabel dengan berbagai jenis join.

Dengan kemampuan ini, pengguna R dapat mengelola dan menganalisis data yang tersimpan dalam database relasional secara efisien, baik untuk dataset kecil maupun besar.

LS0tDQp0aXRsZTogIkRhdGFiYXNlIGluIFIiDQphdXRob3I6ICJOZ3VyYWggU2VudGFuYSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ193aWR0aDogOA0KICAgIGZpZ19oZWlnaHQ6IDUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyBEYXRhYmFzZSBpbiBSDQoNCkRhbGFtIGFuYWxpc2lzIGRhdGEgbW9kZXJuLCBrZW1hbXB1YW4gdW50dWsgdGVyaHVidW5nIGRhbiBtZW5nZWxvbGEgZGF0YWJhc2UgcmVsYXNpb25hbCBtZXJ1cGFrYW4ga2V0ZXJhbXBpbGFuIHBlbnRpbmcuIFIgbWVueWVkaWFrYW4gYmVyYmFnYWkgcGFrZXQgeWFuZyBtZW11bmdraW5rYW4gcGVuZ2d1bmEgdW50dWsgYmVyaW50ZXJha3NpIGRlbmdhbiBiZXJiYWdhaSBzaXN0ZW0gbWFuYWplbWVuIGJhc2lzIGRhdGEgKERCTVMpIHNlcGVydGkgU1FMaXRlLCBNeVNRTCwgUG9zdGdyZVNRTCwgZGFuIGxhaW5ueWEgbWVsYWx1aSBhbnRhcm11a2EgeWFuZyBrb25zaXN0ZW4uIERva3VtZW4gaW5pIGFrYW4gbWVtYmFoYXMgbGFuZ2thaC1sYW5na2FoIGtvbmVrc2kgZGF0YWJhc2UgZGkgUiwgcGVyYmVkYWFuIGFudGFyYSBmdW5nc2kgcGVuZ2FtYmlsYW4gZGF0YSwgc2VydGEgdGVrbmlrIHBlbmdnYWJ1bmdhbiB0YWJlbCBtZW5nZ3VuYWthbiBzaW50YWtzwqBgZHBseXJgwqBkYW4gU1FMLg0KDQojIyAqKlBha2V0IFIgdW50dWsgS29uZWtzaSBEYXRhYmFzZSoqDQoNCkJlcmlrdXQgYWRhbGFoIGJlYmVyYXBhIHBha2V0IFIgeWFuZyB1bXVtIGRpZ3VuYWthbiB1bnR1ayBrb25la3NpIGRhbiBtYW5pcHVsYXNpIGRhdGFiYXNlOg0KDQotICAgKipgREJJYCoqOiBBbnRhcm11a2EgdW11bSB1bnR1ayBvcGVyYXNpIGRhdGFiYXNlIGRpIFIuDQoNCi0gICAqKmBSU1FMaXRlYCoqOiBLaHVzdXMgdW50dWsgZGF0YWJhc2UgU1FMaXRlLg0KDQotICAgKipgUk15c1FMYCoqOiBVbnR1ayBkYXRhYmFzZSBNeVNRTC4NCg0KLSAgICoqYFJQb3N0Z3Jlc2AqKjogVW50dWsgUG9zdGdyZVNRTC4NCg0KLSAgICoqYG9kYmNgKio6IFVudHVrIGRhdGFiYXNlIHlhbmcgbWVuZHVrdW5nIE9EQkMuDQoNCi0gICAqKmBkcGx5cmAgJiBgZGJwbHlyYCoqOiBNZW5nb252ZXJzaSBzaW50YWtzIGBkcGx5cmAgbWVuamFkaSBrdWVyaSBTUUwuDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KFJTUUxpdGUpDQpsaWJyYXJ5KERCSSkNCmBgYA0KDQojIyAqKkxhbmdrYWgtTGFuZ2thaCBLb25la3NpIERhdGFiYXNlIGRpIFIqKg0KDQpQcm9zZXMga29uZWtzaSBrZSBkYXRhYmFzZSBkYXJpIFIgbWVuZ2lrdXRpIGFsdXIgYmVyaWt1dDoNCg0KMS4gICoqUGFuZ2dpbCBwYWtldCBgREJJYCoqOg0KDQogICAgYGBge3J9DQogICAgbGlicmFyeShEQkkpDQogICAgYGBgDQoNCjIuICAqKlBhbmdnaWwgcGFrZXQgZHJpdmVyIGRhdGFiYXNlKiogKG1pc2FsIGBSU1FMaXRlYCk6DQoNCiAgICBgYGB7cn0NCiAgICBsaWJyYXJ5KFJTUUxpdGUpDQogICAgYGBgDQoNCjMuICAqKkJ1a2Ega29uZWtzaSoqIGRlbmdhbiBgZGJDb25uZWN0KClgOg0KDQogICAgYGBge3J9DQogICAgY29uIDwtIGRiQ29ubmVjdChTUUxpdGUoKSwgIkM6XFxVc2Vyc1xcTGVnaW9uXFxEb2N1bWVudHNcXEFzaXN0ZW4gRG9zZW5cXFNhaW5zIERhdGFcXFAzLVBlbmdvbGFoYW4tRGF0YWJhc2UtZGFuLURhdGEtU3Bhc2lhbC1NZW5nZ3VuYWthbi1SXFxDaGlub29rX1NxbGl0ZS5zcWxpdGUiKQ0KICAgIGBgYA0KDQo0LiAgKipDZWsgdGFiZWwgeWFuZyB0ZXJzZWRpYSoqIGRlbmdhbiBgZGJMaXN0VGFibGVzKClgOg0KDQogICAgYGBge3J9DQogICAgZGJMaXN0VGFibGVzKGNvbikNCiAgICBgYGANCg0KNS4gICoqSmFsYW5rYW4ga3VlcmkgU1FMKiogZGVuZ2FuIGBkYkdldFF1ZXJ5KClgIGF0YXUgYGRiU2VuZFF1ZXJ5KClgLg0KDQo2LiAgKipUdXR1cCBrb25la3NpKiogc2V0ZWxhaCBzZWxlc2FpOg0KDQogICAgYGBge3J9DQogICAgZGJEaXNjb25uZWN0KGNvbikNCiAgICBgYGANCg0KIyMgKipLb25la3NpIGtlIFNRTGl0ZTogU3R1ZGkgS2FzdXMgQ2hpbm9vayBEYXRhYmFzZSoqDQoNCkRhdGFiYXNlIENoaW5vb2sgZGlndW5ha2FuIHNlYmFnYWkgY29udG9oLiBCZXJpa3V0IGxhbmdrYWgtbGFuZ2thaG55YToNCg0KYGBge3J9DQojIEtvbmVrc2kga2UgZGF0YWJhc2UgDQpjaGlub29rIDwtIGRiQ29ubmVjdChTUUxpdGUoKSwgIkM6XFxVc2Vyc1xcTGVnaW9uXFxEb2N1bWVudHNcXEFzaXN0ZW4gRG9zZW5cXFNhaW5zIERhdGFcXFAzLVBlbmdvbGFoYW4tRGF0YWJhc2UtZGFuLURhdGEtU3Bhc2lhbC1NZW5nZ3VuYWthbi1SXFxDaGlub29rX1NxbGl0ZS5zcWxpdGUiKSAgDQojIExpaGF0IHRhYmVsIHlhbmcgYWRhIA0KZGJMaXN0VGFibGVzKGNoaW5vb2spICANCiMgQWtzZXMgdGFiZWwgQ3VzdG9tZXIgDQpjdXN0b21lciA8LSB0Ymwoc3JjID0gY2hpbm9vaywgIkN1c3RvbWVyIikgDQpnbGltcHNlKGN1c3RvbWVyKQ0KYGBgDQoNCioqQ2F0YXRhbioqOiBPYmplayBgdGJsYCBoYW55YSB0ZXJodWJ1bmcga2UgZGF0YWJhc2UsIHRpZGFrIGRpc2ltcGFuIHNlcGVudWhueWEgZGkgbWVtb3JpIFIuIEluaSBtZW5naGVtYXQgUkFNIHVudHVrIGRhdGFzZXQgYmVzYXIuDQoNCiMjICoqUGVyYmFuZGluZ2FuIGBkYkdldFF1ZXJ5KClgIGRhbiBgZGJTZW5kUXVlcnkoKWAqKg0KDQp8ICoqQXNwZWsqKiB8IGBkYkdldFF1ZXJ5KClgIHwgYGRiU2VuZFF1ZXJ5KClgIHwNCnw6LS0tfDotLS18Oi0tLXwNCnwgKipUdWp1YW4qKiB8IE1lbmdla3Nla3VzaSBrdWVyaSBkYW4gbGFuZ3N1bmcgbWVuZ2FtYmlsIGhhc2lsIHNlYmFnYWkgYGRhdGEuZnJhbWVgLiB8IE1lbmdpcmltIGt1ZXJpIHRhbnBhIGxhbmdzdW5nIG1lbmdhbWJpbCBoYXNpbC4gfA0KfCAqKk1hbmFqZW1lbiBNZW1vcmkqKiB8IFNlbXVhIGhhc2lsIGRpbXVhdCBzZWthbGlndXMga2UgUkFNLiB8IERhdGEgZGFwYXQgZGlhbWJpbCBiZXJ0YWhhcCBkZW5nYW4gYGRiRmV0Y2goKWAuIHwNCnwgKipQZW1iZXJzaWhhbioqIHwgT3RvbWF0aXMuIHwgSGFydXMgZGliZXJzaWhrYW4gbWFudWFsIGRlbmdhbiBgZGJDbGVhclJlc3VsdCgpYC4gfA0KDQoqKkNvbnRvaMKgYGRiR2V0UXVlcnkoKWAqKjoNCg0KYGBge3J9DQplbXBsb3llZSA8LSBkYkdldFF1ZXJ5KGNoaW5vb2ssICJTRUxFQ1QgKiBGUk9NIEVtcGxveWVlIikNCnN0cihlbXBsb3llZSkNCmBgYA0KDQoqKkNvbnRvaMKgYGRiU2VuZFF1ZXJ5KClgKio6DQoNCmBgYHtyfQ0KcXVlcnkgPC0gZGJTZW5kUXVlcnkoY2hpbm9vaywgIlNFTEVDVCAqIEZST00gQ3VzdG9tZXIiKQ0Kd2hpbGUgKCFkYkhhc0NvbXBsZXRlZChxdWVyeSkpIHsNCiAgY2h1bmsgPC0gZGJGZXRjaChxdWVyeSwgbiA9IDEwKQ0KICBwcmludChjaHVuaykNCn0NCmRiQ2xlYXJSZXN1bHQocXVlcnkpDQpgYGANCg0KIyMgKipNZW1idWF0IERhdGFiYXNlIFNRTGl0ZSBkaSBSKioNCg0KS2l0YSBkYXBhdCBtZW1idWF0IGRhdGFiYXNlIFNRTGl0ZSBsYW5nc3VuZyBkYXJpIFI6DQoNCmBgYHtyfQ0KIyBCdWF0IGtvbmVrc2kga2UgZGF0YWJhc2UgYmFydQ0KY29uMiA8LSBkYkNvbm5lY3QoU1FMaXRlKCksICJteWRiLnNxbGl0ZSIpDQoNCiMgR3VuYWthbiBkYXRhc2V0IGNvbnRvaA0KbGlicmFyeShtbGJlbmNoKQ0KZGF0YSgiQnJlYXN0Q2FuY2VyIikNCm5hbWVzKEJyZWFzdENhbmNlcikgPC0gc3RyX3JlcGxhY2VfYWxsKG5hbWVzKEJyZWFzdENhbmNlciksICJcXC4iLCAiX18iKQ0KDQojIFR1bGlzIHRhYmVsIGtlIGRhdGFiYXNlDQpkYldyaXRlVGFibGUoY29uMiwgIkJyZWFzdENhbmNlciIsIEJyZWFzdENhbmNlciwgb3ZlcndyaXRlID0gVFJVRSkNCg0KIyBDZWsgdGFiZWwNCmRiTGlzdFRhYmxlcyhjb24yKQ0KDQojIEhhcHVzIG9iamVrIGRhbiBwdXR1cyBrb25la3NpDQpybShCcmVhc3RDYW5jZXIpDQpkYkRpc2Nvbm5lY3QoY29uMikNCmBgYA0KDQojIyAqKlNRTCBRdWVyeSBNZW5nZ3VuYWthbiBgZHBseXJgKioNCg0KU2ludGFrcyBgZHBseXJgIGRhcGF0IGRpdGVyamVtYWhrYW4gb3RvbWF0aXMgbWVuamFkaSBTUUw6DQoNCmBgYHtyfQ0KaW52b2ljZV9jb3VudHJ5IDwtIHRibChjaGlub29rLCAiSW52b2ljZSIpICU+JQ0KICBncm91cF9ieShCaWxsaW5nQ291bnRyeSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2ludm9pY2UgPSBtZWFuKFRvdGFsKSkNCg0KIyBMaWhhdCBrdWVyaSBTUUwtbnlhDQpzaG93X3F1ZXJ5KGludm9pY2VfY291bnRyeSkNCg0KIyBLb252ZXJzaSBrZSBkYXRhLmZyYW1lIHVudHVrIGRpdGFtcGlsa2FuDQppbnZvaWNlX2NvdW50cnkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KYGBgDQoNCiMjICoqUGVuZ2dhYnVuZ2FuIFRhYmVsIChKb2luaW5nKSoqDQoNClBlbmdnYWJ1bmdhbiB0YWJlbCBhZGFsYWggb3BlcmFzaSBmdW5kYW1lbnRhbCBkYWxhbSBkYXRhYmFzZS4gQmVyaWt1dCBqZW5pcy1qZW5pcyBqb2luIHlhbmcgdW11bToNCg0KIyMjICoqSmVuaXMtSmVuaXMgSm9pbioqDQoNCjEuICAqKklubmVyIEpvaW4qKjogSGFueWEgYmFyaXMgeWFuZyBjb2NvayBkaSBrZWR1YSB0YWJlbC4NCg0KMi4gICoqTGVmdCBKb2luKio6IFNlbXVhIGJhcmlzIGRhcmkgdGFiZWwga2lyaSwgZGFuIHlhbmcgY29jb2sgZGFyaSBrYW5hbi4NCg0KMy4gICoqUmlnaHQgSm9pbioqOiBTZW11YSBiYXJpcyBkYXJpIHRhYmVsIGthbmFuLCBkYW4geWFuZyBjb2NvayBkYXJpIGtpcmkuDQoNCjQuICAqKkZ1bGwgSm9pbioqOiBTZW11YSBiYXJpcyBkYXJpIGtlZHVhIHRhYmVsLg0KDQo1LiAgKipTZW1pIEpvaW4qKjogQmFyaXMgZGFyaSBraXJpIHlhbmcgY29jb2sgZGVuZ2FuIGthbmFuIChoYW55YSBrb2xvbSBraXJpKS4NCg0KNi4gICoqQW50aSBKb2luKio6IEJhcmlzIGRhcmkga2lyaSB5YW5nIHRpZGFrIGNvY29rIGRlbmdhbiBrYW5hbi4NCg0KIyMjICoqQ29udG9oIGRlbmdhbiBEYXRhIEJhbmQqKg0KDQpgYGB7cn0NCmRhdGEoImJhbmRfbWVtYmVycyIsIHBhY2thZ2UgPSAiZHBseXIiKQ0KZGF0YSgiYmFuZF9pbnN0cnVtZW50cyIsIHBhY2thZ2UgPSAiZHBseXIiKQ0KDQojIElubmVyIEpvaW4NCmlubmVyX2pvaW4oYmFuZF9tZW1iZXJzLCBiYW5kX2luc3RydW1lbnRzLCBieSA9ICJuYW1lIikNCg0KIyBMZWZ0IEpvaW4NCmxlZnRfam9pbihiYW5kX21lbWJlcnMsIGJhbmRfaW5zdHJ1bWVudHMpDQoNCiMgRnVsbCBKb2luDQpmdWxsX2pvaW4oYmFuZF9tZW1iZXJzLCBiYW5kX2luc3RydW1lbnRzKQ0KDQojIFNlbWkgSm9pbg0Kc2VtaV9qb2luKGJhbmRfbWVtYmVycywgYmFuZF9pbnN0cnVtZW50cykNCg0KIyBBbnRpIEpvaW4NCmFudGlfam9pbihiYW5kX21lbWJlcnMsIGJhbmRfaW5zdHJ1bWVudHMpDQpgYGANCg0KIyMjICoqSm9pbiBkZW5nYW4gS29sb20gQmVyYmVkYSBOYW1hKioNCg0KYGBge3J9DQpkYXRhKCJiYW5kX2luc3RydW1lbnRzMiIsIHBhY2thZ2UgPSAiZHBseXIiKSANCmZ1bGxfam9pbihiYW5kX21lbWJlcnMsIGJhbmRfaW5zdHJ1bWVudHMyLCBieSA9IGMoIm5hbWUiID0gImFydGlzdCIpKQ0KYGBgDQoNCiMjIyAqKkpvaW4gZGVuZ2FuIERhdGFiYXNlKioNCg0KYGBge3J9DQpyZXMgPC0gdGJsKGNoaW5vb2ssICJDdXN0b21lciIpICU+JSAgIA0KICBzZWxlY3QoQ3VzdG9tZXJJZCwgRmlyc3ROYW1lLCBMYXN0TmFtZSwgQ291bnRyeSkgJT4lICAgDQogIGxlZnRfam9pbih0YmwoY2hpbm9vaywgIkludm9pY2UiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChDdXN0b21lcklkLCBUb3RhbCksICAgICAgICAgICAgIA0KICAgICAgICAgICAgYnkgPSAiQ3VzdG9tZXJJZCIpIA0KZ2xpbXBzZShyZXMpDQpgYGANCg0KRG9rdW1lbiBpbmkgdGVsYWggbWVtYmFoYXM6DQoNCi0gICBLb25la3NpIFIga2UgZGF0YWJhc2UgU1FMaXRlLg0KDQotICAgUGVuZ2d1bmFhbiBgREJJYCwgYFJTUUxpdGVgLCBkYW4gYGRwbHlyYCB1bnR1ayBtYW5pcHVsYXNpIGRhdGEuDQoNCi0gICBQZXJiZWRhYW4gYW50YXJhIGBkYkdldFF1ZXJ5YCBkYW4gYGRiU2VuZFF1ZXJ5YC4NCg0KLSAgIFRla25payBwZW5nZ2FidW5nYW4gdGFiZWwgZGVuZ2FuIGJlcmJhZ2FpIGplbmlzIGpvaW4uDQoNCkRlbmdhbiBrZW1hbXB1YW4gaW5pLCBwZW5nZ3VuYSBSIGRhcGF0IG1lbmdlbG9sYSBkYW4gbWVuZ2FuYWxpc2lzIGRhdGEgeWFuZyB0ZXJzaW1wYW4gZGFsYW0gZGF0YWJhc2UgcmVsYXNpb25hbCBzZWNhcmEgZWZpc2llbiwgYmFpayB1bnR1ayBkYXRhc2V0IGtlY2lsIG1hdXB1biBiZXNhci4NCg==