Bab 4 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. Tentu saja saat ini sangat banyak tipe data yang didukung oleh R dengan bantuan tambahan package yang sesuai. Namun pada kesempatan ini hanya akan membahas beberapa jenis data file eksternal dan jenis database.

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")
  }
}

4.1 File Eksternal

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

4.1.1 Textfile

Textfile adalah salah satu jenis file yang sering digunakan untuk menyimpan atau bertukar data. Fungsi yang sudah tersedia di R untuk import textfile adalah read.table() dan read.delim(). Apa perbedaan dari kedua fungsi ini? Kita akan membahasnya di bagian ini.

Yang pertama kita akan membahas fungsi read.table(). Untuk mengetahui argumen yang digunakan oleh fungsi ini dan contoh penggunaannya kita dapat lihat pada help dengan mengetik perintah berikut ini di console.

?read.table

Misalnya kita akan import data dari file bernama iris.txt yang ada di dalam folder D:\data dan kita simpan sebagai objek dataframe iris_txt. Kita dapat gunakan perintah berikut ini.

iris_txt <- read.table("D:/data/iris.txt", header = TRUE)

Karena baris pertama pada file tersebut adalah nama kolom, maka kita tambahkan argumen header = TRUE. Jika baris pertama pada file yang akan kita import adalah bagian dari data, maka kita gunakan argumen header = FALSE. Kita lihat beberapa baris pertama dari data yang sudah kita import di atas. Kita gunakan fungsi head() untuk melihat 6 (enam) baris pertama paling atas yang ada di dataframe tersebut.

head(iris_txt)
##   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

Jika kita perhatikan, pemisah antar kolom (delimiter) pada file tersebut adalah spasi. Ketika delimiter pada file yang akan kita import berbeda, kita dapat gunakan fungsi read.delim(). Penggunaannya hampir sama dengan fungsi read.table(). Hanya saja menambahkan argumen sep = "\t". Delimiter default pada fungsi ini adalah tab yang disimbolkan dengan \t. Kita cukup mengganti simbol tersebut sesuai dengan yang ada pada file yang akan diimport. Misalnya ketika delimiter pada file yang akan diimport adalah | maka delimiternya menjadi sep = "|" seperti contoh berikut ini.

iris_delim <- read.delim("D:/data/iris_custom.txt", header = TRUE, sep = "|")

Jika Anda hilangkan argumen sep = "|" apa yang terjadi?

Menggunakan Package

Selain menggunakan fungsi dari R sendiri yang sudah kita bahas, ada banyak package yang dapat digunakan untuk import data dari textfile.Salah satunya adalah package {readr} yang menjadi bagian dari package {tidyverse}. Aktifkan package yang dibutuhkan dengan menggunakan fungsi library(). Untuk import data dari textfile, salah satunya kita dapat menggunakan fungsi read_delim() dari package {readr}.

## [1] '2.0.1'

Sama halnya ketika kita akan import data dari textfile dengan delimiter tertentu seperti yang sudah dibahas ketika menggunakan fungsi read.delim(). 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_txt <- read_delim(file = "D:/data/iris.txt", delim = " ", col_names = TRUE)

4.1.2 CSV

Selain textfile, CSV juga merupakan format file yang sering digunakan untuk menyimpan atau bertukar data. Fungsi yang tersedia di R untuk dapat mengimport data dari file CSV adalah read.csv() dan read.csv2(). Apa perbedaan dari kedua fungsi bersaudara ini? Mari kita bahas.

iris_csv <- read.csv(file = "data/iris.csv", header = TRUE)
head(iris_csv)
##   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

Fungsi read.csv() digunakan untuk file CSV yang menggunakan simbol koma (,) sebagai delimiternya, sedangkan untuk file CSV yang menggunakan simbol titik koma (;) sebagai delimiternya kita dapat menggunakan fungsi read.csv2().

Menggunakan Package

Package {readr} menyiapkan fungsi read_csv() untuk import data dari file CSV.

iris2 <- read_csv("data/iris.csv", col_names = TRUE)
## Rows: 150 Columns: 5
## -- Column specification ---------------------------------------------------------------
## Delimiter: ","
## chr (1): Species
## dbl (4): Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
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

4.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

4.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.

4.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 database.

Pertama kita harus membuat koneksi ke database yang akan diakses. Misalnya database yang akan digunkana bernama mydatabase. Perintah di bawah ini tidak dapat Anda jalankan kecuali Anda mempunyai database di lokal komputer Anda dengan pengaturan yang sama.

library(RMySQL)
my_con <- dbConnect(drv = RMySQL::MySQL(),
                    # alamat IP database
                    host = "localhost",
                    # nama database
                    dbname = "mydatabase",
                    # user ID
                    user = "username",
                    # password
                    password = "Password",
                    # port database
                    port = 3306
                    )
my_con

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

dbListTables(my_con)

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)

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

dbDisconnect(my_con)

4.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 {RPostgress}. Contoh database yang digunakan kali ini memanfaatkan jasa penyedia layanan database PostgreSQL online secara gratis. Anda dapat mencoba akses database berikut ini jika Anda mempunyai koneksi internet yang cukup baik. Jika Anda mengalami kesulitan atau mengalami kendala ketika mengakses database yang digunakan berikut ini, silahkan hubungi penulis. Anda juga dipersilahkan jika ingin mencoba membuat database sendiri di https://elephantsql.com.

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

Anda dapat mencoba sendiri untuk membuat koneksi dan mengakses database dari PostgreSQL yang sudah disiapkan dan dapat diakses secara remote. Gunakan fungsi dbListTables() untuk mengetahui nama tabel yang sudah ada di dalam database tersebut.

dbListTables(pg_con)

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)

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)

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

dbDisconnect(pg_con)

4.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}.

# dari {base}
data <- readRDS("data/iris.rds")
head(data)
##   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
# dari package {readr}
data <- read_rds("data/iris.rds")
head(data)
##   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