Tugas Akhir Praktikum STA261
A. Akses Database (chinook) menggunakan Engine SQL dan DPLYR
memanggil package tidyverse, RSQLite, dan DBI agar dapat melakukan pemanggilan database
library(tidyverse)## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.5 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.1.0 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.1.2
## Warning: package 'stringr' was built under R version 4.1.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(RSQLite)## Warning: package 'RSQLite' was built under R version 4.1.2
library(DBI)## Warning: package 'DBI' was built under R version 4.1.2
Engine SQL
Untuk melakukan eksekusi syntax SQL dan menampilkan hasilnya perlu dibuat suatu objek connection terlebih dahulu yaitu dengan:
chinook<-dbConnect(SQLite(), "C:/sqlite/db/chinook.db")Kemudian dapat kita periksa Class dari objek chinook ini
class(chinook)## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
Lalu untuk menampilkan syntax SQL di rmarkdown dapat dilakukan dengan {r, connection=chinook, engine="sql"} pada bagian atas chunk yang digunakan, selanjutnya dapat dimasukkan syntax SQL yang diinginkan
SELECT
EmployeeId, FirstName, Fax, Email
FROM
employees
ORDER BY FirstName| EmployeeId | FirstName | Fax | |
|---|---|---|---|
| 1 | Andrew | +1 (780) 428-3457 | andrew@chinookcorp.com |
| 3 | Jane | +1 (403) 262-6712 | jane@chinookcorp.com |
| 8 | Laura | +1 (403) 467-8772 | laura@chinookcorp.com |
| 4 | Margaret | +1 (403) 263-4289 | margaret@chinookcorp.com |
| 6 | Michael | +1 (403) 246-9899 | michael@chinookcorp.com |
| 2 | Nancy | +1 (403) 262-3322 | nancy@chinookcorp.com |
| 7 | Robert | +1 (403) 456-8485 | robert@chinookcorp.com |
| 5 | Steve | 1 (780) 836-9543 | steve@chinookcorp.com |
Maka yang akan muncul adalah daftar Fax dan Email setiap employee, beserta EmpoyeeID, yang diurutkan berdasarkan FirstName.
Menggunakan DPLYR
sama seperti Engine SQL perlu dibuat objek connection terlebih dahulu
chinook<-dbConnect(SQLite(), "C:/sqlite/db/chinook.db")Selanjutnya dapat diperiksa tables yang terdapat di dalam database yaitu dengan:
dbListTables(chinook)## [1] "albums" "artists" "customers" "employees"
## [5] "genres" "invoice_items" "invoices" "media_types"
## [9] "playlist_track" "playlists" "sqlite_sequence" "sqlite_stat1"
## [13] "tracks"
Untuk mengakses tabel, dapat dilakukan dengan memasukkan tabel yang diinginkan dalam database sebagai objek
tracks<-tbl(chinook, "tracks")dan dapat dilihat juga Class dari objek tersebut
class(tracks)## [1] "tbl_SQLiteConnection" "tbl_dbi" "tbl_sql"
## [4] "tbl_lazy" "tbl"
Berikut adalah isi dari objek tracks
tracks## # Source: table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\sqlite\db\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>
Seandainya ingin diketahui track tersingkat dalam setiap album yang harganya 0.99, dan diurutkan secara ascending berdasarkan AlbumId. Untuk memperoleh informasi tersebut dapat dilakukan dengan:
t<- tracks %>%
filter(UnitPrice==0.99) %>%
group_by(AlbumId) %>%
summarize(milliseconds=min(Milliseconds)) %>%
arrange(AlbumId)
t## Warning: Missing values are always removed in SQL.
## Use `MIN(x, na.rm = TRUE)` to silence this warning
## This warning is displayed only once per session.
## # Source: lazy query [?? x 2]
## # Database: sqlite 3.37.0 [C:\sqlite\db\chinook.db]
## # Ordered by: AlbumId
## AlbumId milliseconds
## <int> <int>
## 1 1 199836
## 2 2 342562
## 3 3 230619
## 4 4 215196
## 5 5 215875
## 6 6 176117
## 7 7 152084
## 8 8 126511
## 9 9 221701
## 10 10 206053
## # ... with more rows
Syntax R tersebut juga dapat diterjemahkan menjadi Engile SQL dengan:
show_query(t)## <SQL>
## SELECT `AlbumId`, MIN(`Milliseconds`) AS `milliseconds`
## FROM `tracks`
## WHERE (`UnitPrice` = 0.99)
## GROUP BY `AlbumId`
## ORDER BY `AlbumId`
B. Data Wrangling
Untuk melakukan data wrangling maka perlu dipanggil package tidyverse terlebih dahulu
library(tidyverse)Untuk menggunakan datasets yang tersedia di package datasets maka perlu dipanggil juga packagenya
library(datasets)Misalkan akan digunakan datasets Theoph maka perlu dibuat objeknya, selanjutnya dapat diubah class objek tersebut menjadi tibble
data("Theoph")
theoph<-as_tibble(Theoph)
class(theoph)## [1] "tbl_df" "tbl" "data.frame"
dengan penggunaan tibble, maka ketika data ditampilkan hanya akan menampilkan 10 baris data pertama dari keseluruhan data, seperti contoh objek theoph ketika ingin ditampilkan isi objeknya maka akan menampilkan seperti ini:
theoph## # A tibble: 132 x 5
## Subject Wt Dose Time conc
## <ord> <dbl> <dbl> <dbl> <dbl>
## 1 1 79.6 4.02 0 0.74
## 2 1 79.6 4.02 0.25 2.84
## 3 1 79.6 4.02 0.57 6.57
## 4 1 79.6 4.02 1.12 10.5
## 5 1 79.6 4.02 2.02 9.66
## 6 1 79.6 4.02 3.82 8.58
## 7 1 79.6 4.02 5.1 8.36
## 8 1 79.6 4.02 7.03 7.47
## 9 1 79.6 4.02 9.05 6.89
## 10 1 79.6 4.02 12.1 5.94
## # ... with 122 more rows
Selanjutnya dapat dilakukan berbagai manipulasi data seperti summarize, arrange, filter, select, dan mutate
- Rata-rata
concsetiapsubject
theoph%>%group_by(Subject)%>%summarise(mean=mean(conc))## # A tibble: 12 x 2
## Subject mean
## <ord> <dbl>
## 1 6 3.53
## 2 7 3.91
## 3 8 4.27
## 4 11 4.51
## 5 3 5.09
## 6 2 4.82
## 7 4 4.94
## 8 9 4.89
## 9 12 5.41
## 10 10 5.93
## 11 1 6.44
## 12 5 5.78
- Mengurutkan data berdasarkan berat objek (
Wt) dari yang terkecil
theoph%>%arrange(Wt)## # A tibble: 132 x 5
## Subject Wt Dose Time conc
## <ord> <dbl> <dbl> <dbl> <dbl>
## 1 5 54.6 5.86 0 0
## 2 5 54.6 5.86 0.3 2.02
## 3 5 54.6 5.86 0.52 5.63
## 4 5 54.6 5.86 1 11.4
## 5 5 54.6 5.86 2.02 9.33
## 6 5 54.6 5.86 3.5 8.74
## 7 5 54.6 5.86 5.02 7.56
## 8 5 54.6 5.86 7.02 7.09
## 9 5 54.6 5.86 9.1 5.9
## 10 5 54.6 5.86 12 4.37
## # ... with 122 more rows
- Memilih data yang
Dose> 5.00
theoph%>%filter(Dose>5.00)## # A tibble: 33 x 5
## Subject Wt Dose Time conc
## <ord> <dbl> <dbl> <dbl> <dbl>
## 1 5 54.6 5.86 0 0
## 2 5 54.6 5.86 0.3 2.02
## 3 5 54.6 5.86 0.52 5.63
## 4 5 54.6 5.86 1 11.4
## 5 5 54.6 5.86 2.02 9.33
## 6 5 54.6 5.86 3.5 8.74
## 7 5 54.6 5.86 5.02 7.56
## 8 5 54.6 5.86 7.02 7.09
## 9 5 54.6 5.86 9.1 5.9
## 10 5 54.6 5.86 12 4.37
## # ... with 23 more rows
- Membuat subset data yang berisi
Subject,Time, danconc
theoph%>%select(Subject,Time,conc)## # A tibble: 132 x 3
## Subject Time conc
## <ord> <dbl> <dbl>
## 1 1 0 0.74
## 2 1 0.25 2.84
## 3 1 0.57 6.57
## 4 1 1.12 10.5
## 5 1 2.02 9.66
## 6 1 3.82 8.58
## 7 1 5.1 8.36
## 8 1 7.03 7.47
## 9 1 9.05 6.89
## 10 1 12.1 5.94
## # ... with 122 more rows
- Menambahkan peubah
rateyaitu laju reaksi dari theophylline (rate = conc/Time)
theoph%>%mutate(rate=conc/Time)## # A tibble: 132 x 6
## Subject Wt Dose Time conc rate
## <ord> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 79.6 4.02 0 0.74 Inf
## 2 1 79.6 4.02 0.25 2.84 11.4
## 3 1 79.6 4.02 0.57 6.57 11.5
## 4 1 79.6 4.02 1.12 10.5 9.37
## 5 1 79.6 4.02 2.02 9.66 4.78
## 6 1 79.6 4.02 3.82 8.58 2.25
## 7 1 79.6 4.02 5.1 8.36 1.64
## 8 1 79.6 4.02 7.03 7.47 1.06
## 9 1 79.6 4.02 9.05 6.89 0.761
## 10 1 79.6 4.02 12.1 5.94 0.490
## # ... with 122 more rows
- Menampilkan data yang berisi
Subject,Time, danrate, dimana data yang ditampilkan adalah data yangDose>5.00, dan diurutkan berdasarkanDose
theophdata<-theoph%>%
filter(Dose>5.00)%>%
mutate(rate=conc/Time)%>%
arrange(desc(Dose))%>%
select(Subject, Dose, rate)
theophdata## # A tibble: 33 x 3
## Subject Dose rate
## <ord> <dbl> <dbl>
## 1 5 5.86 NaN
## 2 5 5.86 6.73
## 3 5 5.86 10.8
## 4 5 5.86 11.4
## 5 5 5.86 4.62
## 6 5 5.86 2.50
## 7 5 5.86 1.51
## 8 5 5.86 1.01
## 9 5 5.86 0.648
## 10 5 5.86 0.364
## # ... with 23 more rows