Bab 3 Import dan Export Data

//TODO: Membahas cara membaca data eksternal (textfile, cvs, Excel dan database) menggunakan berbagai fungsi dan package.

Sebagai alat bantu untuk mengolah, analisis dan visualisasi data sekaligus juga sebagai bahasa pemrograman tentunya R harus memiliki kemampuan untuk mebaca data. Oleh karena itu, R dibekali kemampuan membaca data atau import dari file dan database. Selain harus bisa imprort data, kemampuan lain adalah export data atau hasil analisis data.

Jalankan program berikut untuk memastikan semua package yang dibutuhkan sudah terinstall.

{
  if(!require(readr)){
    install.packages("readr")
  }
  if(!require(readxl)){
    install.packages("readxl")
  }
  if(!require(writexl)){
    install.packages("writexl")
  }
  if(!require(RMySQL)){
    install.packages("RMySQL")
  }
  if(!require(RPostgres)){
    install.packages("RPostgres")
  }
}

3.1 File Eksternal

Jenis file yang akan dibahas adalah textfile (*.txt), CSV (*.csv) dan Excel file.

3.1.1 Textfile

Textfile adalah salah satu jenis file yang sering digunakan untuk menyimpan atau bertukar data. Aktifkan package yang dibutuhkan dengan menggunakan fungsi library(). Untuk import data dari textfile, kita dapat menggunakan fungsi read_delim() dari package {readr}.

library(readr)

Kita dapat menggunakan fungsi read_delim() seperti di bawah ini. Argumen file = adalah lokasi dan nama file yang ingin kita import. Kemudian argumen delim = adalah untuk menunjukkan delimiter/separator/pemisah kolom yang ada pada file tersebut. Argumen col_names = TRUE jika baris pertama pada file tersebut adalah nama kolom. Contoh perintah di bawah ini akan menyimpan hasil import (jika berhasil) ke dalam sebuah objek dataframe bernama iris.

iris <- read_delim(file = "data/iris.txt", delim = " ", col_names = TRUE)
## Parsed with column specification:
## cols(
##   Sepal.Length = col_double(),
##   Sepal.Width = col_double(),
##   Petal.Length = col_double(),
##   Petal.Width = col_double(),
##   Species = col_character()
## )

Kita dapat melihat data yang sudah berhasil diimport dengan memanggil dataframe tersebut.

iris
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <chr>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows

3.1.2 CSV

Selain textfile, CSV juga merupakan format file yang sering digunakan untuk menyimpan atau bertukar data. Package {readr} menyiapkan fungsi read_csv() untuk import data dari file CSV.

iris2 <- read_csv("data/iris.csv", col_names = TRUE)
## Parsed with column specification:
## cols(
##   Sepal.Length = col_double(),
##   Sepal.Width = col_double(),
##   Petal.Length = col_double(),
##   Petal.Width = col_double(),
##   Species = col_character()
## )
iris2
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <chr>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows

3.1.3 Excel

Jenis file lain yang juga sering digunakan adalah file Excel. Kita dapat menggunakan package {readxl} dengan fungsi read_excel() untuk import data dari file Excel. Argumen path = adalah lokasi dan nama file Excel yang akan kita gunakan.

library(readxl)
iris_xl <- read_excel(path = "data/iris.xlsx", col_names = TRUE)
iris_xl
## # A tibble: 150 x 5
##    `Sepal Length` `Sepal Width` `Petal Length` `Petal Width` Species
##             <dbl>         <dbl>          <dbl>         <dbl> <chr>  
##  1            5.1           3.5            1.4           0.2 setosa 
##  2            4.9           3              1.4           0.2 setosa 
##  3            4.7           3.2            1.3           0.2 setosa 
##  4            4.6           3.1            1.5           0.2 setosa 
##  5            5             3.6            1.4           0.2 setosa 
##  6            5.4           3.9            1.7           0.4 setosa 
##  7            4.6           3.4            1.4           0.3 setosa 
##  8            5             3.4            1.5           0.2 setosa 
##  9            4.4           2.9            1.4           0.2 setosa 
## 10            4.9           3.1            1.5           0.1 setosa 
## # ... with 140 more rows

3.2 Database

R sebagai program untuk statistik dan analisis data juga didukung dengan kemampuan untuk mengakses data pada database. Kita akan demonstrasikan cara import data dari Database Management System (DBMS) MySQL dan PostgreSQL.

3.2.1 MySQL

Agar R dapat berinteraksi dengan DBMS MySQL kita perlu install package {RMySQL}. Package {RMySQL} hingga saat ini masih mempunyai keterbatasan, yaitu dapat berjalan dengan baik pada DBMS MySQL versi 5. Namun pada MySQL versi 8 tidak dapat eksport data dari R menjadi tabel di datbase.

Pertama kita harus membuat koneksi ke database yang akan diakses. Misalnya database yang akan digunkana bernama insw.

library(RMySQL)
## Loading required package: DBI
my_con <- dbConnect(drv = RMySQL::MySQL(),
                    # alamat IP database
                    host = "localhost",
                    # nama database
                    dbname = "insw",
                    # user ID
                    user = "user1",
                    # password
                    password = "P@ssw0rd",
                    # port database
                    port = 3306
                    )
my_con
## <MySQLConnection:0,0>

Kita dapat mengetahui nama tabel yang ada di dalam database yang kita akses.

dbListTables(my_con)
## [1] "iris"

Untuk dapat import tabel dari database menjadi dataframe di R, kita dapat gunakan fungsi dbReadTable(). Sebutkan objek koneksi yang sebelumnya kita buat dan nama tabel yang akan kita akses.

my_iris <- dbReadTable(my_con, "iris")
head(my_iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Setelah selesai mengakses database, jangan lupa untuk memutus koneksi (disconnect) dengan fungsi dbDisconnect().

dbDisconnect(my_con)
## [1] TRUE

3.2.2 PostgreSQL

DBMS lain yang akan digunakan untuk contoh kali ini adlaah PostgreSQL. Ada beberapa package yang dapat digunakan untuk membuat koneksi dan akses DBMS PostgreSQL dari R, diantaranya adalah package {RPostgres} dan {RPostgreSQL}. Kali ini kita akan menggunakan package {RPostgre}.

library(RPostgres)
pg_con <- dbConnect(RPostgres::Postgres(),
                    # alamat IP database
                    host = "rosie.db.elephantsql.com",
                    # port
                    port = 5432,
                    # nama database
                    dbname = "nfjvlkjy",
                    # username
                    user = "nfjvlkjy",
                    # password
                    password = "uDTq8jJo6kMxAg1TECN3WK8UeXGKqndJ"
                    )
pg_con
## <PqConnection> nfjvlkjy@rosie.db.elephantsql.com:5432

Anda dapat mencoba sendiri untuk membuat koneksi dan mengakses database dari PostgreSQL yang sudah disiapkan dan dapat diakses secara remote. Pilih salah satu database berikut ini. Setiap user yang disiapkan ini hanya dapat diakses oleh 5 (lima) koneksi bersamaan.

Database insw1 ----------- :
host = "rosie.db.elephantsql.com",
port = 5432,
dbname = "nfjvlkjy",
user = "nfjvlkjy",
password = "uDTq8jJo6kMxAg1TECN3WK8UeXGKqndJ"

Database insw2 ----------- :
host = "rosie.db.elephantsql.com"
port = 5432,
dbname = "puxgpqon"
user = "puxgpqon"
password = "Uzz11fMtsa6FF7HiVlgbsoEMQY7aCU1l"

Database insw3 ----------- :
host = "rosie.db.elephantsql.com"
port = 5432,
dbname = "rlfaqywf"
user = "rlfaqywf"
password = "S9WeVTXadYe7S53LL6jOimrJjSqcNA0j"

Database insw4 ----------- :
host = "rosie.db.elephantsql.com"
port = 5432,
dbname = "rmfvkrom"
user = "rmfvkrom"
password = "DY68gguHq8zfSX33xQAkT1m0MKdJOxi-"

Database insw5 ----------- :
host = "rosie.db.elephantsql.com"
port = 5432,
dbname = "exfhferr"
user = "exfhferr"
password = "0pJgk0RzvhryVHNpJi_G63FIQe1qDK7M"

Gunakan fungsi dbListTables() untuk mengetahui nama tabel yang sudah ada di dalam database tersebut.

dbListTables(pg_con)
## [1] "iris"               "pg_stat_statements"

Sama seperti ketika kita import tabel dari DBMS MySQL, kita gunakan fungsi dbReadTable() dengan menyebutkan nama tabel yang akan diimport.

pg_iris <- dbReadTable(pg_con, "iris")
head(pg_iris)
##   sepal_length sepal_width petal_length petal_width species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Untuk eksport dataframe dari R menjadi tabel di database kita gunakan fungsi dbWriteTable(). Argumen name = adalah nama tabel di DBMS hasil ekspor nanti, value = adalah nama dataframe yang akan kita ekspor.

dbWriteTable(pg_con, name = "aep_iris", value = iris, row.names = FALSE, overwrite = TRUE)
dbListTables(pg_con)
## [1] "iris"               "pg_stat_statements" "aep_iris"

Terkahir setelah selesai mengakses data yang kita butuhkan selalu putuskan koneksi (disconnet).

dbDisconnect(pg_con)

3.3 File RDS

File RDS adalah format file eksternal dari objek yang ada di R. Semua data ketika kita mengolah data di disimpan di dalam memory. Oleh karena itu ketika kita menutup sesi R yang sedang berjalan, maka semua data atau objek yang ada akan hilang. Namun kita bisa ekspor objek yang nantinya ingin kita gunakan kembali di dalam sebuah file eksternal dengan format RDS.

Untuk dapat menggunakan data yang ada di dalam file RDS kita dapat gunakan fungsi readRDS() dari pakage {base} atau read_rds() dari package {readr}. Kita akan gunakan fungsi read_rds().

data <- read_rds("data/fl_pelatihan.rds")
data
## # A tibble: 71,265 x 23
##    tanggal    container_id berth_time          hari_berth waktu_berth iso_code
##    <date>     <chr>        <dttm>              <fct>      <chr>       <chr>   
##  1 2019-12-21 APHU6242420  2019-12-20 09:30:20 Jumat      03:00-10:00 45G1    
##  2 2019-12-21 APHU6242420  2019-12-20 09:30:20 Jumat      03:00-10:00 45G1    
##  3 2019-12-20 APHU6247083  2019-12-20 09:30:20 Jumat      03:00-10:00 4500    
##  4 2019-12-31 APHU6363910  2019-12-31 09:25:31 Selasa     03:00-10:00 4500    
##  5 2019-12-31 APHU6364578  2019-12-31 09:25:31 Selasa     03:00-10:00 45G1    
##  6 2019-12-31 APHU6364578  2019-12-31 09:25:31 Selasa     03:00-10:00 45G1    
##  7 2019-12-31 APHU6437822  2019-12-31 09:25:31 Selasa     03:00-10:00 45G1    
##  8 2019-12-29 APHU6524402  2019-12-29 12:30:29 Minggu     10:00-18:00 4500    
##  9 2019-12-25 APHU6584016  2019-12-25 14:15:25 Rabu       10:00-18:00 45G1    
## 10 2019-12-20 APHU6601052  2019-12-20 09:30:20 Jumat      03:00-10:00 45G1    
## # ... with 71,255 more rows, and 17 more variables: container_status <chr>,
## #   exim <chr>, carrier <chr>, pol <chr>, pod <chr>, nama_negara_asal <chr>,
## #   discharge_time <dttm>, stacking_time <dttm>, hari_stacking <fct>,
## #   waktu_stacking <chr>, mita_non_mita <chr>, jalur <chr>, flag_lartas <chr>,
## #   prenon_nonpre <chr>, postborder <chr>, karantina <chr>, dt <dbl>