Berhubungan dengan Data Eksternal

Paket yang akan digunakan

library(utils)
library(foreign)
library(DBI)
## Warning: package 'DBI' was built under R version 4.0.5
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 4.0.5

Set working directory ke folder yang berisi data/ tempat menyimpan data.

setwd("~/Annissa/data")

Paket utils

Paket utils digunakan untuk membaca atau menulis data dengan format csv. Membaca data

data1 <- read.csv("penduduk.csv")
head(data1)
##   Shape_Leng Shape_Area                    ADM1_EN ADM1_PCODE Jumlah_Penduduk
## 1  27.367364 4.62543728                       Aceh       ID11         5274871
## 2   6.026648 0.45871703                       Bali       ID51         4317404
## 3   9.279900 0.76491115                     Banten       ID36        11904562
## 4  11.653771 1.63012892                   Bengkulu       ID17         2010670
## 5   3.341561 0.26012975 Daerah Istimewa Yogyakarta       ID34         3668719
## 6   3.123689 0.05342567                Dki Jakarta       ID31        10562088

Menyimpan data

nama <- c("a", "b", "c", "d", "e")
nilai <- c(100, 90, 80, 70, 60)
data2 <- cbind(nama,nilai)
head(data2)
##      nama nilai
## [1,] "a"  "100"
## [2,] "b"  "90" 
## [3,] "c"  "80" 
## [4,] "d"  "70" 
## [5,] "e"  "60"

menyimpan data dalam format csv dengan syntax berikut.

write.csv(data2, "data2.csv")

Dari gambar di atas, data telah tersimpan pada folder data. Apabila csv dalam angka format Indonesia, maka pemisah antar kolom akan menggunakan ; (semicolon). Terdapat sedikit perbedaan, yaitu untuk membaca data menggunakan fungsi read.csv2() dan untuk menyimpan data menggunakan fungsi write.csv2().

Paket Foreign

Paket foreign digunakan untuk membaca atau menulis data pada dbase dan aplikasi statistik umum. Berikut adalah beberapa contohnya

dbase

membaca data

data3 <- read.dbf("idn_admbnda_adm3_bps_20200401.dbf")
head(data3)
##   Shape_Leng  Shape_Area              ADM3_EN ADM3_PCODE ADM3_REF ADM3ALT1EN
## 1  0.2798656 0.003107633 2 X 11 Enam Lingkung  ID1306050     <NA>       <NA>
## 2  0.7514001 0.016925540    2 X 11 Kayu Tanam  ID1306052     <NA>       <NA>
## 3  0.6900061 0.024636382                 Abab  ID1612030     <NA>       <NA>
## 4  0.6483629 0.010761277                Abang  ID5107050     <NA>       <NA>
## 5  0.2437073 0.001160459                Abeli  ID7471021     <NA>       <NA>
## 6  1.3541886 0.069956902              Abenaho  ID9432030     <NA>       <NA>
##   ADM3ALT2EN                    ADM2_EN ADM2_PCODE           ADM1_EN ADM1_PCODE
## 1       <NA>            Padang Pariaman     ID1306    Sumatera Barat       ID13
## 2       <NA>            Padang Pariaman     ID1306    Sumatera Barat       ID13
## 3       <NA> Penukal Abab Lematang Ilir     ID1612  Sumatera Selatan       ID16
## 4       <NA>                Karang Asem     ID5107              Bali       ID51
## 5       <NA>               Kota Kendari     ID7471 Sulawesi Tenggara       ID74
## 6       <NA>                     Yalimo     ID9432             Papua       ID94
##     ADM0_EN ADM0_PCODE       date    validOn validTo
## 1 Indonesia         ID 2019-12-20 2020-04-01    <NA>
## 2 Indonesia         ID 2019-12-20 2020-04-01    <NA>
## 3 Indonesia         ID 2019-12-20 2020-04-01    <NA>
## 4 Indonesia         ID 2019-12-20 2020-04-01    <NA>
## 5 Indonesia         ID 2019-12-20 2020-04-01    <NA>
## 6 Indonesia         ID 2019-12-20 2020-04-01    <NA>

menyimpan data

write.dbf(data2, "data2.dbf")

Stata

membaca data hanya dapat dilakukan khusus versi tertentu, yaitu version 5-12.

menyimpan data

write.dta(data3, "data3.dta")

Data akan tersimpan pada folder data yang sudah disetting di awal, seperti berikut.

Paket Database Interface (DBI)

Paket ini digunakan untuk menghubungkan dataframe dengan database relational. Harus diimplementasikan dengan paket R seperti RODBC, RSQLite, RMySQL, dsb. ### RODBC RODBC dapat digunakan untuk membaca dan menulis data dengan format excel, dBase, Access, dll yang memiliki database connector odbc. Hal yang dapat dilakukan dengan Paket RODBC yaitu connect ke DB, membuat channel, melakukan query dan fetch, serta save.

RSQLite

Menciptakan database baru menggunakan dbConnect()

mydb <- dbConnect(RSQLite::SQLite(),"database.sqlite")

Jika database sementara (tidak ingin disimpan) maka bisa menggunakan "" sebagai ganti nama file database yang akan dibuat.

Mengcopy data frame menggunakan dbWriteTable()

dbWriteTable(mydb, "mtcars", mtcars)
dbWriteTable(mydb, "iris", iris)
dbListTables(mydb)
## [1] "iris"   "mtcars"

Data akan tersimpan pada dbbaru.sqlite di folder data.

Queries menggunakan dbGetQuery()

dbGetQuery(mydb, 'SELECT * FROM mtcars LIMIT 5')
##    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

Tidak semua nama variabel R valid dengan nama variabel SQL, dibutuhkan “namavar”

dbGetQuery(mydb, 'SELECT * FROM iris WHERE "Sepal.Length" 
< 4.6')
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.4         2.9          1.4         0.2  setosa
## 2          4.3         3.0          1.1         0.1  setosa
## 3          4.4         3.0          1.3         0.2  setosa
## 4          4.5         2.3          1.3         0.3  setosa
## 5          4.4         3.2          1.3         0.2  setosa

Batched queries untuk mempartisi hasil queries menjadi beberapa bagian dengan cara menentukan jumlah baris maksimum (n) setiap partisinya.

rs <- dbSendQuery(mydb, 'SELECT * FROM mtcars')
while (!dbHasCompleted(rs)) {
dat.f <- dbFetch(rs, n = 10)
print(nrow(dat.f))
}
## [1] 10
## [1] 10
## [1] 10
## [1] 2
dbClearResult(rs)

Multiple parameterised queries

rs <- dbSendQuery(mydb, 'SELECT * FROM iris WHERE 
"Sepal.Length" < :x')
dbBind(rs, param = list(x = 4.5))
nrow(dbFetch(rs))
## [1] 4
dbBind(rs, param = list(x = 4.4))
nrow(dbFetch(rs))
## [1] 1

multiple parameters dalam satu panggilan dengan syntax berikut

dbBind(rs, param = list(x = seq(4.4, 4.5, by=0.1)))
nrow(dbFetch(rs))
## [1] 5
dbClearResult(rs)

DBI memiliki fungsi dbSendStatement() dan dbExecute() untuk statement SQL yang tidak menghasilkan tabular. Contohnya pada statement Delete berikut.

dbExecute(mydb, 'DELETE FROM iris WHERE 
"Sepal.Length" < 4')
## [1] 0
rs <- dbSendStatement(mydb, 'DELETE FROM iris 
WHERE "Sepal.Length" < :x')
dbBind(rs, param = list(x = 4.5))
dbGetRowsAffected(rs)
## [1] 4
dbClearResult(rs)
dbDisconnect(mydb)