Pertemuan 13-Wrangling

library(tidyverse)
## Warning: package 'dplyr' was built under R version 4.4.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
?tidyverse
## starting httpd help server ... done
library(datasets)
data(iris)
iris <- tibble::as.tibble(iris)
## Warning: `as.tibble()` was deprecated in tibble 2.0.0.
## ℹ Please use `as_tibble()` instead.
## ℹ The signature and semantics have changed, see `?as_tibble`.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#install.packages("dplyr")
library(dplyr)
class(iris)
## [1] "tbl_df"     "tbl"        "data.frame"
view(iris)
head(iris)
## # A tibble: 6 × 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
## 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
glimpse(iris)
## Rows: 150
## Columns: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.…
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.…
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.…
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.…
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, setosa, s…
mean(iris$Sepal.Length) == iris$Sepal.Length %>% mean () #%>% tuh dpl yr ada di package tidyverse 
## [1] TRUE
mean(iris$Sepal.Length)
## [1] 5.843333
mean(iris$Sepal.Length) == iris$Sepal.Length %>% mean ()
## [1] TRUE
x <- c(0.109, 0.359, 0.63, 0.996, 0.515, 0.142, 0.017, 0.829, 0.907)
x 
## [1] 0.109 0.359 0.630 0.996 0.515 0.142 0.017 0.829 0.907
round (exp(diff(log(x))),1)
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1
x %>% log () %>%
  diff() %>%
  exp() %>%
  round(1) 
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1

Data Filtering

Data filtering digunakan untuk memilih subset dari dataset berdasarkan kondisi tertentu.

Mengambil bunga iris dengan Petal.Width lebih dari 2.0 cm

filtered_iris <- filter(iris, Petal.Width > 2.0)
head(filtered_iris)
## # A tibble: 6 × 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>    
## 1          6.3         3.3          6           2.5 virginica
## 2          7.1         3            5.9         2.1 virginica
## 3          6.5         3            5.8         2.2 virginica
## 4          7.6         3            6.6         2.1 virginica
## 5          7.2         3.6          6.1         2.5 virginica
## 6          6.8         3            5.5         2.1 virginica

Mengambil data dari Petal.Width, Species, Petal.Length

iris %>% filter(Species=="setosa")
## # A tibble: 50 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  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 
## # ℹ 40 more rows
iris %>% select(Petal.Width,Species,Petal.Length)
## # A tibble: 150 × 3
##    Petal.Width Species Petal.Length
##          <dbl> <fct>          <dbl>
##  1         0.2 setosa           1.4
##  2         0.2 setosa           1.4
##  3         0.2 setosa           1.3
##  4         0.2 setosa           1.5
##  5         0.2 setosa           1.4
##  6         0.4 setosa           1.7
##  7         0.3 setosa           1.4
##  8         0.2 setosa           1.5
##  9         0.2 setosa           1.4
## 10         0.1 setosa           1.5
## # ℹ 140 more rows
iris %>% select(-Petal.Width,-Species)
## # A tibble: 150 × 3
##    Sepal.Length Sepal.Width Petal.Length
##           <dbl>       <dbl>        <dbl>
##  1          5.1         3.5          1.4
##  2          4.9         3            1.4
##  3          4.7         3.2          1.3
##  4          4.6         3.1          1.5
##  5          5           3.6          1.4
##  6          5.4         3.9          1.7
##  7          4.6         3.4          1.4
##  8          5           3.4          1.5
##  9          4.4         2.9          1.4
## 10          4.9         3.1          1.5
## # ℹ 140 more rows

Data Arranging

Data arranging digunakan untuk mengurutkan data berdasarkan satu atau lebih variabel.

Mengurutkan berdasarkan peubah sepale.length dari nilai terkecil

iris %>% arrange (Sepal.Length)
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          4.3         3            1.1         0.1 setosa 
##  2          4.4         2.9          1.4         0.2 setosa 
##  3          4.4         3            1.3         0.2 setosa 
##  4          4.4         3.2          1.3         0.2 setosa 
##  5          4.5         2.3          1.3         0.3 setosa 
##  6          4.6         3.1          1.5         0.2 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          4.6         3.6          1           0.2 setosa 
##  9          4.6         3.2          1.4         0.2 setosa 
## 10          4.7         3.2          1.3         0.2 setosa 
## # ℹ 140 more rows

Mengurutkan berdasarkan peubah Sepal.Length dari nilai terbesar

iris %>% arrange(desc(Sepal.Length))
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>    
##  1          7.9         3.8          6.4         2   virginica
##  2          7.7         3.8          6.7         2.2 virginica
##  3          7.7         2.6          6.9         2.3 virginica
##  4          7.7         2.8          6.7         2   virginica
##  5          7.7         3            6.1         2.3 virginica
##  6          7.6         3            6.6         2.1 virginica
##  7          7.4         2.8          6.1         1.9 virginica
##  8          7.3         2.9          6.3         1.8 virginica
##  9          7.2         3.6          6.1         2.5 virginica
## 10          7.2         3.2          6           1.8 virginica
## # ℹ 140 more rows

Data Reshaping

Data reshaping melibatkan pengubahan struktur dataset, seperti dari wide ke long format atau sebaliknya.

Mengubah data dari format wide ke long

long_iris <- pivot_longer(iris, cols = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width), names_to = "Measurement", values_to = "Value")
head(long_iris)
## # A tibble: 6 × 3
##   Species Measurement  Value
##   <fct>   <chr>        <dbl>
## 1 setosa  Sepal.Length   5.1
## 2 setosa  Sepal.Width    3.5
## 3 setosa  Petal.Length   1.4
## 4 setosa  Petal.Width    0.2
## 5 setosa  Sepal.Length   4.9
## 6 setosa  Sepal.Width    3

Mengubah data dari format wide ke long, dimana kita “memanjangkan” data berdasarkan pengukuran sepal dan petal.

Data Merging

Data merging digunakan untuk menggabungkan dua dataset berdasarkan satu atau lebih key.

Menambahkan contoh data eksternal

additional_data <- data.frame(Species = c("setosa", "versicolor", "virginica"), Info = c("Type A", "Type B", "Type C"))
merged_iris <- left_join(iris, additional_data, by = "Species")
head(merged_iris)
## # A tibble: 6 × 6
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Info  
##          <dbl>       <dbl>        <dbl>       <dbl> <chr>   <chr> 
## 1          5.1         3.5          1.4         0.2 setosa  Type A
## 2          4.9         3            1.4         0.2 setosa  Type A
## 3          4.7         3.2          1.3         0.2 setosa  Type A
## 4          4.6         3.1          1.5         0.2 setosa  Type A
## 5          5           3.6          1.4         0.2 setosa  Type A
## 6          5.4         3.9          1.7         0.4 setosa  Type A

Menambahkan contoh data eksternal untuk digabungkan. Misalnya, data eksternal ini berisi informasi tambahan tentang spesies.

Data Aggregating

Data aggregating digunakan untuk menghitung summary statistics dari data berdasarkan grup tertentu.

Menghitung rata-rata sepal length setiap species

iris %>% group_by(Species) %>% summarize (mean=mean(Sepal.Length))
## # A tibble: 3 × 2
##   Species     mean
##   <fct>      <dbl>
## 1 setosa      5.01
## 2 versicolor  5.94
## 3 virginica   6.59

Feature Engineering (Variable Transformation)

Feature engineering melibatkan pembuatan variabel baru yang dapat meningkatkan kinerja model.

Menambah peubah baru

iris %>% filter(Species=="setosa")
## # A tibble: 50 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  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 
## # ℹ 40 more rows
irisbaru <- iris %>% select(-Species, -Petal.Width) %>% mutate(Sepal=Sepal.Length+Sepal.Width)
irisbaru
## # A tibble: 150 × 4
##    Sepal.Length Sepal.Width Petal.Length Sepal
##           <dbl>       <dbl>        <dbl> <dbl>
##  1          5.1         3.5          1.4   8.6
##  2          4.9         3            1.4   7.9
##  3          4.7         3.2          1.3   7.9
##  4          4.6         3.1          1.5   7.7
##  5          5           3.6          1.4   8.6
##  6          5.4         3.9          1.7   9.3
##  7          4.6         3.4          1.4   8  
##  8          5           3.4          1.5   8.4
##  9          4.4         2.9          1.4   7.3
## 10          4.9         3.1          1.5   8  
## # ℹ 140 more rows
engineered_iris <- mutate(iris, Sepal.Area = Sepal.Length * Sepal.Width)
head(engineered_iris)
## # A tibble: 6 × 6
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Area
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>        <dbl>
## 1          5.1         3.5          1.4         0.2 setosa        17.8
## 2          4.9         3            1.4         0.2 setosa        14.7
## 3          4.7         3.2          1.3         0.2 setosa        15.0
## 4          4.6         3.1          1.5         0.2 setosa        14.3
## 5          5           3.6          1.4         0.2 setosa        18  
## 6          5.4         3.9          1.7         0.4 setosa        21.1

Membuat variabel baru yang merupakan hasil perkalian Sepal.Length dengan Sepal.Width.

Penggunaan 2 Fungsi Bersamaan

result1 <- iris %>%
  filter(Petal.Width > 1.5) %>%
  arrange(desc(Sepal.Length))
result1
## # A tibble: 52 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>    
##  1          7.9         3.8          6.4         2   virginica
##  2          7.7         3.8          6.7         2.2 virginica
##  3          7.7         2.6          6.9         2.3 virginica
##  4          7.7         2.8          6.7         2   virginica
##  5          7.7         3            6.1         2.3 virginica
##  6          7.6         3            6.6         2.1 virginica
##  7          7.4         2.8          6.1         1.9 virginica
##  8          7.3         2.9          6.3         1.8 virginica
##  9          7.2         3.6          6.1         2.5 virginica
## 10          7.2         3.2          6           1.8 virginica
## # ℹ 42 more rows

Menyaring data iris untuk mendapatkan bunga dengan Petal.Width lebih besar dari 1.5 cm, kemudian mengurutkan hasilnya berdasarkan Sepal.Length secara descending.

result2 <- iris %>%
  mutate(Sepal.Area = Sepal.Length * Sepal.Width) %>%
  select(Species, Sepal.Length, Sepal.Width, Sepal.Area)

head(result2)
## # A tibble: 6 × 4
##   Species Sepal.Length Sepal.Width Sepal.Area
##   <fct>          <dbl>       <dbl>      <dbl>
## 1 setosa           5.1         3.5       17.8
## 2 setosa           4.9         3         14.7
## 3 setosa           4.7         3.2       15.0
## 4 setosa           4.6         3.1       14.3
## 5 setosa           5           3.6       18  
## 6 setosa           5.4         3.9       21.1

Membuat kolom baru yang merupakan hasil perkalian antara Sepal.Length dan Sepal.Width, yang kita sebut Sepal.Area, lalu memilih hanya beberapa kolom tertentu untuk ditampilkan.