Tidyverse adalah sekumpulan package R yang didesain khusus untuk data science. Tidyverse membantu dalam manajemen data terutama pada impor dan ekspor data, serta pemodelan dan visualisasi data. Dalam package ini memungkinkan penggunaan operator pipes (%>%) untuk memudahkan dalam memahami script, karena ia menunjukkan urutan fungsi yang digunakan.
#install.packages("tictoc")
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6 ✔ purrr 0.3.4
## ✔ tibble 3.1.8 ✔ dplyr 1.0.9
## ✔ tidyr 1.2.0 ✔ stringr 1.4.1
## ✔ readr 2.1.2 ✔ forcats 0.5.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(tictoc)
tic()
cars1 <- read.csv("https://raw.githubusercontent.com/tidyverse/readr/main/inst/extdata/mtcars.csv")
toc()
## 0.804 sec elapsed
tic()
cars2 <- read_csv("https://raw.githubusercontent.com/tidyverse/readr/main/inst/extdata/mtcars.csv")
## Rows: 32 Columns: 11
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (11): mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
toc()
## 2.215 sec elapsed
Lebih cepat import dengan package readr.
Misalkan ingin diterapkan fungsi log > fungsi eksponen > diakar > ditambah 2 > dibagi 10 dibulatkan 2
tryPipes <- c(203, 493, 283, 485, 901, 381, 492, 472, 697, 382, 294, 372, 481)
tryPipes2 <- c(203, 493, 283, 485, 901, 381, 492, 472, 697, 382, 294, 372, 481)
# dengan fungsi biasa
tryPipes <- sqrt(exp(log(tryPipes)))
tryPipes <- round(tryPipes + 2, 2)
tryPipes
## [1] 16.25 24.20 18.82 24.02 32.02 21.52 24.18 23.73 28.40 21.54 19.15 21.29
## [13] 23.93
tryPipes2 %>% log() %>% exp %>% sqrt() %>% +2 %>% round(2)
## [1] 16.25 24.20 18.82 24.02 32.02 21.52 24.18 23.73 28.40 21.54 19.15 21.29
## [13] 23.93
# belum nemu cara mengaplikasikan pembagian/perkalian di pipes operator
Instal dan persiapan penggunaan package ini dapat dilakukan dengan sintaks:
#install.packages("tidyverse")
library(tidyverse)
Terdapat beberapa package yang tergabung dalam tidyverse, antara lain:
#install.packages("readr")
library(readr)
Beberapa fungsi yang terdapat pada package ini antara lain: 1. read_csv() - untuk membaca file ekstensi .csv (comma-separated values) 2. read_tsv() - untuk membaca file ekstensi .tsv (tab-separated values) 3. read_delim() - untuk membaca file delimited lainnya (selain .csv dan .tsv) 4. read_fwf() - untuk membaca file fixed-width 5. read_table() - untuk membaca file whitespace-separated 6. read_log() - untuk membaca file log web
Contoh penggunaan read_csv() adalah sebagai berikut:
getwd()
## [1] "/Users/User/Documents/RFiles"
dataCars <- cars1
head(dataCars)
## 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
## 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
#install.packages("tidyr")
library(tidyr)
tidyrDF <- data.frame(
No = c(1:5),
Total.1 = c(203, 349, 201, 33, 103),
Total.2 = c(92, 394, 203, 68, 70),
Total.3 = c(738, 84, 503, 492, 58))
tidyrDF
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
gath <- tidyrDF %>% gather(Total, Freq, Total.1:Total.3)
gath
## No Total Freq
## 1 1 Total.1 203
## 2 2 Total.1 349
## 3 3 Total.1 201
## 4 4 Total.1 33
## 5 5 Total.1 103
## 6 1 Total.2 92
## 7 2 Total.2 394
## 8 3 Total.2 203
## 9 4 Total.2 68
## 10 5 Total.2 70
## 11 1 Total.3 738
## 12 2 Total.3 84
## 13 3 Total.3 503
## 14 4 Total.3 492
## 15 5 Total.3 58
sepr <- gath %>% separate(Total, c("Main", "Child"))
sepr
## No Main Child Freq
## 1 1 Total 1 203
## 2 2 Total 1 349
## 3 3 Total 1 201
## 4 4 Total 1 33
## 5 5 Total 1 103
## 6 1 Total 2 92
## 7 2 Total 2 394
## 8 3 Total 2 203
## 9 4 Total 2 68
## 10 5 Total 2 70
## 11 1 Total 3 738
## 12 2 Total 3 84
## 13 3 Total 3 503
## 14 4 Total 3 492
## 15 5 Total 3 58
unites <- sepr %>% unite(Total, Main, Child, sep = ".")
unites
## No Total Freq
## 1 1 Total.1 203
## 2 2 Total.1 349
## 3 3 Total.1 201
## 4 4 Total.1 33
## 5 5 Total.1 103
## 6 1 Total.2 92
## 7 2 Total.2 394
## 8 3 Total.2 203
## 9 4 Total.2 68
## 10 5 Total.2 70
## 11 1 Total.3 738
## 12 2 Total.3 84
## 13 3 Total.3 503
## 14 4 Total.3 492
## 15 5 Total.3 58
sprd <- unites %>% spread(Total, Freq)
sprd
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
Digunakan untuk mengisi NA/missing values dengan entry sebelumnya
# Menambah baris mengandung NA
library(tidyverse)
tidyrDF <- tidyrDF %>% add_row(No = 6, Total.1 = NA, Total.2 = 738, Total.3 = 902)
tidyrDF
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 NA 738 902
# Mengganti NA
tidyrDF <- tidyrDF %>% fill(Total.1)
tidyrDF
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 103 738 902
#harus disimpan dalam variabel jika ingin kondisinya tetap terisi
Digunakan untuk membuang observasi yang memiliki missing value.
tidyrDF <- tidyrDF %>% add_row(No = 7, Total.1 = 829, Total.2 = NA, Total.3 = 92)
tidyrDF
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 103 738 902
## 7 7 829 NA 92
tidyrDF %>% drop_na(Total.2)
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 103 738 902
Digunakan untuk mengganti observasi NA dengan nilai tertentu.
tidyrDF <- tidyrDF %>% add_row(No = 7, Total.1 = 829, Total.2 = NA, Total.3 = 92)
tidyrDF
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 103 738 902
## 7 7 829 NA 92
## 8 7 829 NA 92
tidyrDF %>% replace_na(list(Total.2=832))
## No Total.1 Total.2 Total.3
## 1 1 203 92 738
## 2 2 349 394 84
## 3 3 201 203 503
## 4 4 33 68 492
## 5 5 103 70 58
## 6 6 103 738 902
## 7 7 829 832 92
## 8 7 829 832 92
#install.packages("dplyr")
library(dplyr)
heartRate = data.frame(
Class = c(rep(1:3, each=4)),
Name = c(LETTERS[12:23]),
Date = c(sample(1:30, 12)),
Month = c(sample(month.name[1:12], 12)),
Year = c(sample(1990:2015, 12)),
HeartRate = c(sample(90:140, 12))
)
heartRate
## Class Name Date Month Year HeartRate
## 1 1 L 19 June 2006 106
## 2 1 M 5 November 2013 111
## 3 1 N 28 February 2015 109
## 4 1 O 21 December 1991 112
## 5 2 P 8 May 1997 134
## 6 2 Q 4 July 1996 108
## 7 2 R 15 April 2008 124
## 8 2 S 26 January 2009 120
## 9 3 T 30 August 1993 136
## 10 3 U 22 October 2014 126
## 11 3 V 27 March 1998 127
## 12 3 W 23 September 2001 90
Digunakan untuk mengumpulkan data dan meringkas data.
summarise(heartRate, minYear = min(heartRate$Year), maxYear = max(heartRate$Year), meanHR = mean(heartRate$HeartRate), medHR = median(heartRate$HeartRate))
## minYear maxYear meanHR medHR
## 1 1991 2015 116.9167 116
heartRate %>% group_by(Class) %>% summarise(rataRataHR = mean(HeartRate), .groups = 'drop')
## # A tibble: 3 × 2
## Class rataRataHR
## <int> <dbl>
## 1 1 110.
## 2 2 122.
## 3 3 120.
Note: tanpa .groups = ‘drop’, apalagi .groups = ‘keep’ sama saja hasilnya, apa bedanya?
Digunakan untuk memilih data berdasarkan 1 atau lebih kriteria tertentu.
heartRate %>% filter(Year > 2000, HeartRate < 100)
## Class Name Date Month Year HeartRate
## 1 3 W 23 September 2001 90
Untuk mengurutkan data
heartRate %>% arrange(HeartRate)
## Class Name Date Month Year HeartRate
## 1 3 W 23 September 2001 90
## 2 1 L 19 June 2006 106
## 3 2 Q 4 July 1996 108
## 4 1 N 28 February 2015 109
## 5 1 M 5 November 2013 111
## 6 1 O 21 December 1991 112
## 7 2 S 26 January 2009 120
## 8 2 R 15 April 2008 124
## 9 3 U 22 October 2014 126
## 10 3 V 27 March 1998 127
## 11 2 P 8 May 1997 134
## 12 3 T 30 August 1993 136
Untuk menyeleksi data berdasarkan vkolom/ariabel tertentu
heartRate %>% select(Name, Year, HeartRate)
## Name Year HeartRate
## 1 L 2006 106
## 2 M 2013 111
## 3 N 2015 109
## 4 O 1991 112
## 5 P 1997 134
## 6 Q 1996 108
## 7 R 2008 124
## 8 S 2009 120
## 9 T 1993 136
## 10 U 2014 126
## 11 V 1998 127
## 12 W 2001 90
Untuk membentuk variabel baru berdasarkan variabel yang telah terbentuk
heartRate %>% mutate(Status = "")
## Class Name Date Month Year HeartRate Status
## 1 1 L 19 June 2006 106
## 2 1 M 5 November 2013 111
## 3 1 N 28 February 2015 109
## 4 1 O 21 December 1991 112
## 5 2 P 8 May 1997 134
## 6 2 Q 4 July 1996 108
## 7 2 R 15 April 2008 124
## 8 2 S 26 January 2009 120
## 9 3 T 30 August 1993 136
## 10 3 U 22 October 2014 126
## 11 3 V 27 March 1998 127
## 12 3 W 23 September 2001 90
for (i in nrow(heartRate)){
if (heartRate[i,]$HeartRate >= 135){
heartRate[i,]$Status = 'High'
} else if (heartRate$HeartRate[i] <= 100){
heartRate[i,]$Status = 'Low'
} else {
heartRate[i,]$Status = 'Normal'
}
}
## Warning in `[<-.data.frame`(`*tmp*`, i, , value = structure(list(Class = 3L, :
## provided 7 variables to replace 6 variables
heartRate
## Class Name Date Month Year HeartRate
## 1 1 L 19 June 2006 106
## 2 1 M 5 November 2013 111
## 3 1 N 28 February 2015 109
## 4 1 O 21 December 1991 112
## 5 2 P 8 May 1997 134
## 6 2 Q 4 July 1996 108
## 7 2 R 15 April 2008 124
## 8 2 S 26 January 2009 120
## 9 3 T 30 August 1993 136
## 10 3 U 22 October 2014 126
## 11 3 V 27 March 1998 127
## 12 3 W 23 September 2001 90
Untuk membentuk variabel bar berdasarkan variabel yang telah terbentuk, bedanya hanya menampilkan variabel baru.
Untuk mengambil nilai random dari data
sample(heartRate, 2)
## Name Month
## 1 L June
## 2 M November
## 3 N February
## 4 O December
## 5 P May
## 6 Q July
## 7 R April
## 8 S January
## 9 T August
## 10 U October
## 11 V March
## 12 W September
sample_n(heartRate, 5)
## Class Name Date Month Year HeartRate
## 1 3 U 22 October 2014 126
## 2 2 S 26 January 2009 120
## 3 1 O 21 December 1991 112
## 4 3 V 27 March 1998 127
## 5 3 T 30 August 1993 136
sample_frac(heartRate, 0.3)
## Class Name Date Month Year HeartRate
## 1 2 Q 4 July 1996 108
## 2 2 R 15 April 2008 124
## 3 1 L 19 June 2006 106
## 4 2 P 8 May 1997 134
#install.packages("ggplot2")
library(ggplot2)
Beberapa komponen yang ada pada ggplot2 antara lain: 1. Data : elemen data itu sendiri 2. Aesthetics : data dipetakan ke dalam beberapa atribut Aesthetics seperti x-axis (sumbu x), y-axis (sumbu y), color, size, labels, alpha, shape, line width, line type, dan lain-lain. 3. Facets : menampilkan bagian/subset data dengan kolom-kolom atau baris-baris 4. Statistics : menggolongkan, smoothing, deskriptif, dan intermediate 5. Coordinates : area display data menggunakan Cartesian, fixed, polar, limit 6. Themes : komponen lain yang tidak berhubungan langsung dengan data
Fungsi yang dipakai adalah ggplot().
library(datasets)
head(cars)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
ggplot(data = cars)
ggplot(data = cars,
aes(x = speed, y = dist))
ggplot(data = cars,
aes(x = speed, y = dist)) + geom_point()
# + harus diletakkan 1 line
ggplot(data = cars,
aes(x = speed, y = dist)) + geom_point(col = "red", shape = "square")
ggplot(data = cars,
aes(x = speed)) + geom_histogram(binwidth = 1)
ggplot(data = cars,
aes(x = dist)) + geom_histogram(binwidth = 5)