R dapat melakukan eksekusi syntax SQL serta menampilkan hasilnya. Hal ini dimungkinkan karena terdapat package rmarkdown yang memfasilitasi penggunaan engine SQL di R.
untuk menggunakan rmarkdown sebelumnya harus membuat suatu objek connection serta menggunakan connection ini bersama dengan engine sql.
Di sini saya membuat objek db yang terkoneksi dengan database chinook.db. alamat file yang disimpan disesuaikan dengan pengguna masing-masing di mana file tersebut disimpan.
db<-DBI::dbConnect(RSQLite::SQLite(), "C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db")
dalam kurung kurawal, opsi connection digunakan untuk objek db dan opsi engine digunakan untuk "sql". sehingga kita dapat menuliskan syntax SQL di dalamnya.
SELECT
*
FROM
albums
ORDER BY
Title DESC;
| AlbumId | Title | ArtistId |
|---|---|---|
| 208 | [1997] Black Light Syndrome | 136 |
| 240 | Zooropa | 150 |
| 267 | Worlds | 202 |
| 334 | Weill: The Seven Deadly Sins | 264 |
| 8 | Warner 25 Anos | 6 |
| 239 | War | 150 |
| 175 | Walking Into Clarksdale | 115 |
| 287 | Wagner: Favourite Overtures | 221 |
| 182 | Vs. | 118 |
| 53 | Vozes do MPB | 21 |
Secara umum, koneksi terhadap database di R menggunkan syntax sebagai berikut:
DBI::dbConnect(RSQLite::SQLite(), path = ":dbname:")
untuk menjalanan syntax ini saya menggunakan database chinook yang disimpan pada C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db.
chinook<-DBI::dbConnect(RSQLite::SQLite(), "C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db")
class(chinook)
## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
RSQLite::dbListTables(chinook)
## [1] "albums" "artists" "customers" "employees"
## [5] "genres" "invoice_items" "invoices" "media_types"
## [9] "playlist_track" "playlists" "sqlite_sequence" "sqlite_stat1"
## [13] "tracks"
dplyr::tbl(chinook, "tracks")
## # Source: table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## # Relasional\chinook.db]
## TrackId Name AlbumId MediaTypeId GenreId Composer Milliseconds Bytes
## <int> <chr> <int> <int> <int> <chr> <int> <int>
## 1 1 For Tho~ 1 1 1 Angus Young~ 343719 1.12e7
## 2 2 Balls t~ 2 2 1 <NA> 342562 5.51e6
## 3 3 Fast As~ 3 2 1 F. Baltes, ~ 230619 3.99e6
## 4 4 Restles~ 3 2 1 F. Baltes, ~ 252051 4.33e6
## 5 5 Princes~ 3 2 1 Deaffy & R.~ 375418 6.29e6
## 6 6 Put The~ 1 1 1 Angus Young~ 205662 6.71e6
## 7 7 Let's G~ 1 1 1 Angus Young~ 233926 7.64e6
## 8 8 Inject ~ 1 1 1 Angus Young~ 210834 6.85e6
## 9 9 Snowbal~ 1 1 1 Angus Young~ 203102 6.60e6
## 10 10 Evil Wa~ 1 1 1 Angus Young~ 263497 8.61e6
## # ... with more rows, and 1 more variable: UnitPrice <dbl>
tracks<- dplyr::tbl(chinook, "tracks")
class(tracks)
## [1] "tbl_SQLiteConnection" "tbl_dbi" "tbl_sql"
## [4] "tbl_lazy" "tbl"
tracks
## # Source: table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## # Relasional\chinook.db]
## TrackId Name AlbumId MediaTypeId GenreId Composer Milliseconds Bytes
## <int> <chr> <int> <int> <int> <chr> <int> <int>
## 1 1 For Tho~ 1 1 1 Angus Young~ 343719 1.12e7
## 2 2 Balls t~ 2 2 1 <NA> 342562 5.51e6
## 3 3 Fast As~ 3 2 1 F. Baltes, ~ 230619 3.99e6
## 4 4 Restles~ 3 2 1 F. Baltes, ~ 252051 4.33e6
## 5 5 Princes~ 3 2 1 Deaffy & R.~ 375418 6.29e6
## 6 6 Put The~ 1 1 1 Angus Young~ 205662 6.71e6
## 7 7 Let's G~ 1 1 1 Angus Young~ 233926 7.64e6
## 8 8 Inject ~ 1 1 1 Angus Young~ 210834 6.85e6
## 9 9 Snowbal~ 1 1 1 Angus Young~ 203102 6.60e6
## 10 10 Evil Wa~ 1 1 1 Angus Young~ 263497 8.61e6
## # ... with more rows, and 1 more variable: UnitPrice <dbl>
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
q<-tracks %>%
select(TrackId, AlbumId, UnitPrice) %>%
filter(UnitPrice>1)
q
## # Source: lazy query [?? x 3]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## # Relasional\chinook.db]
## TrackId AlbumId UnitPrice
## <int> <int> <dbl>
## 1 2819 226 1.99
## 2 2820 227 1.99
## 3 2821 227 1.99
## 4 2822 227 1.99
## 5 2823 227 1.99
## 6 2824 227 1.99
## 7 2825 227 1.99
## 8 2826 227 1.99
## 9 2827 227 1.99
## 10 2828 227 1.99
## # ... with more rows
dplyr::show_query(q)
## <SQL>
## SELECT *
## FROM (SELECT `TrackId`, `AlbumId`, `UnitPrice`
## FROM `tracks`)
## WHERE (`UnitPrice` > 1.0)
class(chinook) berarti objek chinook mempunyai Class SQLiteConnection.
Lalu, RSQLite::dbListTables(chinook) yang memiliki fungsi dbListTables digunakan untuk melihat tabel-tabel yang terdapat di dalam database.
Untuk mengakses database dapat menggunakan fungsi tbl(database, "tables") dari package dplyr. dalam contoh di atas saya ingin melihat isi dari tabel tracks dari database chinook. Dengan tracks merupakan objek dengan class tbl.
dplyr::tbl(chinook, "tracks") tracks<- dplyr::tbl(chinook, "tracks") class(tracks)
Di bagian akhir kita ingin mengetahui tracks dengan UnitPrice di atas 1.00 dengan menampilkan TrackId, AlbumId, dan UnitPrice.
Kemudian dplyr dengan fungsi show_query() digunakan untuk menerjemahkan pipeline.
Data Wrangling merupakan proses transformasi suatu data mentah menjadi suatu data yang dapat dipakai untuk analisis. Di sini kita akan menggunakan package tidyverse.
Sebelum memulai data wrangling, pastikan sudah terinstall package tidyverse. Jika belum, dapat menggunakan syntax di bawah ini.
install.packages("tidyverse")
setelah terinstall selanjutnya memuat package tidyverse
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.5 v stringr 1.4.0
## v tidyr 1.1.4 v forcats 0.5.1
## v readr 2.0.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
di sini akan menggunakan syntax ??tidyverse untuk melihat isi dari package tidyverse atau dapat juga menggunakan syntax help(tidyverse)
??tidyverse
## starting httpd help server ... done
Kita sekarang akan menentukan datasets yang akan digunakan yang berada dalam package datasets. Jika kita tidak mengetahui isi-isi dari libray datasets dapat menggunakan syntax library(help="datasets").
library(datasets)
library(help = "datasets")
Kita menggunakan data airquality dari library datasets. Penggunakan syntax tibble::as_tibble() untuk mengubah class suatu datasets menjadi tibble
data(airquality)
airquality<-tibble::as_tibble(airquality)
class(airquality)
## [1] "tbl_df" "tbl" "data.frame"
Dengan memuat library tidyverse kita dapat juga menggunakan fungsi-fungsi dari dplyr seperti fungsi glimpse() yang memberikan rangkuman tentang keadaan data.
glimpse(airquality)
## Rows: 153
## Columns: 6
## $ Ozone <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, 18, 14, ~
## $ Solar.R <int> 190, 118, 149, 313, NA, NA, 299, 99, 19, 194, NA, 256, 290, 27~
## $ Wind <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6, 6.9, 9~
## $ Temp <int> 67, 72, 74, 62, 56, 66, 65, 59, 61, 69, 74, 69, 66, 68, 58, 64~
## $ Month <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,~
## $ Day <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,~
Terdapat suatu operator yang bernama pipes %>% yang sangat populer di kalangan pengguna tidyvese yang mana operator pipes ini memudahkan pengguna untuk melihat urutan suatu program dijalankan.
mean(airquality$Temp) == airquality$Temp %>% mean()
## [1] TRUE
x<-c(0.54,0.61,0.94,0.87,0.11,0.31,0.69,0.88,0.1)
round(exp(diff(log(x))), 1)
## [1] 1.1 1.5 0.9 0.1 2.8 2.2 1.3 0.1
x %>% log() %>%
diff() %>%
exp() %>%
round(1)
## [1] 1.1 1.5 0.9 0.1 2.8 2.2 1.3 0.1
Fungsi-Fungsi di sini merupakan fungsi yang berada pada package dplyr yang mana juga sudah dipanggil dari package tidyverse. Fungsi-fungsi yang akan digunakan, antara lain summarise(), arrange(), filter(), select(), dan mutate() ### summarise() summarise() berfungsi untuk meringkas data
Menghitung rata-rata temperatur tiap bulannya
airquality %>% group_by(Month) %>% summarise(mean.Temp=mean(Temp),.groups='drop')
## # A tibble: 5 x 2
## Month mean.Temp
## <int> <dbl>
## 1 5 65.5
## 2 6 79.1
## 3 7 83.9
## 4 8 84.0
## 5 9 76.9
Menghitung rata-rata kecepatan angin tiap bulannya
airquality %>% group_by(Month) %>% summarise(mean.Wind=mean(Wind),.groups='drop')
## # A tibble: 5 x 2
## Month mean.Wind
## <int> <dbl>
## 1 5 11.6
## 2 6 10.3
## 3 7 8.94
## 4 8 8.79
## 5 9 10.2
Menghitung rata-rata radiasi matahari tiap bulannya
Terlihat rata-rata radiasi matahari terdapat data yang tidak ada, NA (Not Available), ini terjadi karena data mentah airquality memang memiliki beberapa data kosong sehingga tidak dapat dihitung rata-ratanya.
airquality %>% group_by(Month) %>% summarise(mean.Solar=mean(Solar.R),.groups='drop')
## # A tibble: 5 x 2
## Month mean.Solar
## <int> <dbl>
## 1 5 NA
## 2 6 190.
## 3 7 216.
## 4 8 NA
## 5 9 167.
fungsi ini memungkinkan kita untuk mengurutkan data secara menaik (ascending) dan menurun (descending)
Mengurutkan berdasarkan peubah Ozone dari nilai terkecil
airquality %>% arrange(Temp)
## # A tibble: 153 x 6
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 NA NA 14.3 56 5 5
## 2 6 78 18.4 57 5 18
## 3 NA 66 16.6 57 5 25
## 4 NA NA 8 57 5 27
## 5 18 65 13.2 58 5 15
## 6 NA 266 14.9 58 5 26
## 7 19 99 13.8 59 5 8
## 8 1 8 9.7 59 5 21
## 9 8 19 20.1 61 5 9
## 10 4 25 9.7 61 5 23
## # ... with 143 more rows
Mengurutkan berdasarkan peubah Ozone dari nilai terbesar
airquality %>% arrange(desc(Ozone))
## # A tibble: 153 x 6
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 168 238 3.4 81 8 25
## 2 135 269 4.1 84 7 1
## 3 122 255 4 89 8 7
## 4 118 225 2.3 94 8 29
## 5 115 223 5.7 79 5 30
## 6 110 207 8 90 8 9
## 7 108 223 8 85 7 25
## 8 97 267 6.3 92 7 8
## 9 97 272 5.7 92 7 9
## 10 96 167 6.9 91 9 1
## # ... with 143 more rows
filter() berfungsi memilih sebagian data berdasarkan nilai tertentu
Memilih data berdasarkan bulan tertentu
airquality %>% filter(Month=="7")
## # A tibble: 31 x 6
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 135 269 4.1 84 7 1
## 2 49 248 9.2 85 7 2
## 3 32 236 9.2 81 7 3
## 4 NA 101 10.9 84 7 4
## 5 64 175 4.6 83 7 5
## 6 40 314 10.9 83 7 6
## 7 77 276 5.1 88 7 7
## 8 97 267 6.3 92 7 8
## 9 97 272 5.7 92 7 9
## 10 85 175 7.4 89 7 10
## # ... with 21 more rows
Memilih data berdasarkan nilai Ozone yang kosong
airquality %>% filter(is.na(Ozone))
## # A tibble: 37 x 6
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 NA NA 14.3 56 5 5
## 2 NA 194 8.6 69 5 10
## 3 NA 66 16.6 57 5 25
## 4 NA 266 14.9 58 5 26
## 5 NA NA 8 57 5 27
## 6 NA 286 8.6 78 6 1
## 7 NA 287 9.7 74 6 2
## 8 NA 242 16.1 67 6 3
## 9 NA 186 9.2 84 6 4
## 10 NA 220 8.6 85 6 5
## # ... with 27 more rows
select() berfungsi untuk memilih subset data berdasarkan peubah tertentu
Memilih subset data berdasarkan peubah yang ingin dipilih ataupun yang tidak ingin dipilih (dengan tambahan “-”)
airquality %>% select(Month,Day,Ozone,Temp)
## # A tibble: 153 x 4
## Month Day Ozone Temp
## <int> <int> <int> <int>
## 1 5 1 41 67
## 2 5 2 36 72
## 3 5 3 12 74
## 4 5 4 18 62
## 5 5 5 NA 56
## 6 5 6 28 66
## 7 5 7 23 65
## 8 5 8 19 59
## 9 5 9 8 61
## 10 5 10 NA 69
## # ... with 143 more rows
airquality %>% select(-Ozone,-Solar.R)
## # A tibble: 153 x 4
## Wind Temp Month Day
## <dbl> <int> <int> <int>
## 1 7.4 67 5 1
## 2 8 72 5 2
## 3 12.6 74 5 3
## 4 11.5 62 5 4
## 5 14.3 56 5 5
## 6 14.9 66 5 6
## 7 8.6 65 5 7
## 8 13.8 59 5 8
## 9 20.1 61 5 9
## 10 8.6 69 5 10
## # ... with 143 more rows
mutate() berfungsi untuk menambahkan peubah baru pada data
Menambahkan peubah baru week dengan anggapan hari pertama tiap bulan adalah minggu ke-1 dan seterusnya
airquality %>% mutate(Week=floor((Day+7)/7))
## # A tibble: 153 x 7
## Ozone Solar.R Wind Temp Month Day Week
## <int> <int> <dbl> <int> <int> <int> <dbl>
## 1 41 190 7.4 67 5 1 1
## 2 36 118 8 72 5 2 1
## 3 12 149 12.6 74 5 3 1
## 4 18 313 11.5 62 5 4 1
## 5 NA NA 14.3 56 5 5 1
## 6 28 NA 14.9 66 5 6 1
## 7 23 299 8.6 65 5 7 2
## 8 19 99 13.8 59 5 8 2
## 9 8 19 20.1 61 5 9 2
## 10 NA 194 8.6 69 5 10 2
## # ... with 143 more rows
Apakah kita bisa menjalankan fungsi-fungsi di atas secara bersama-sama? jawabannya bisa dengan menggunakan pipes operator %>%. Contoh di bawah adalah penggunaan fungsi select(), mutate(), dan arrange() serta membuat data baru yaitu udarabaru.
airquality %>% select(Ozone,Temp,Month,Day) %>%
mutate(Week=floor((Day+7)/7)) %>%
arrange(desc(Month))
## # A tibble: 153 x 5
## Ozone Temp Month Day Week
## <int> <int> <int> <int> <dbl>
## 1 96 91 9 1 1
## 2 78 92 9 2 1
## 3 73 93 9 3 1
## 4 91 93 9 4 1
## 5 47 87 9 5 1
## 6 32 84 9 6 1
## 7 20 80 9 7 2
## 8 23 78 9 8 2
## 9 21 75 9 9 2
## 10 24 73 9 10 2
## # ... with 143 more rows
udarabaru <- airquality %>% select(Ozone,Temp,Month,Day) %>%
mutate(Week=floor((Day+7)/7)) %>%
arrange(desc(Month))
udarabaru
## # A tibble: 153 x 5
## Ozone Temp Month Day Week
## <int> <int> <int> <int> <dbl>
## 1 96 91 9 1 1
## 2 78 92 9 2 1
## 3 73 93 9 3 1
## 4 91 93 9 4 1
## 5 47 87 9 5 1
## 6 32 84 9 6 1
## 7 20 80 9 7 2
## 8 23 78 9 8 2
## 9 21 75 9 9 2
## 10 24 73 9 10 2
## # ... with 143 more rows
Semoga bermanfaat terimakasih