1 Manipulasi Data

1.1 Pendahuluan

Manipulasi data atau lebih populernya data manipulation yaitu kegiatan dimana data atau dataset diolah atau “dimodif” agar lebih mudah dibaca dan lebih terorganisasi.

Beberapa kasus yang memerlukan teknik manipulasi data adalah saat kebutuhan analisis data (data analysis) dan visualisasi data (data visualization).

Target pada akhir bahasan ini adalah kita bisa mengenal atau familiar dengan cara-cara atau pendekatan yang diperlukan dalam mempermudah urusan melakukan manipulasi data.

1.2 Persiapan

Pada latihan ini, kita akan mempelajari bagaimana dengan mudah melakukan manipulasi data menggunakan bahasa R dan software RStudio. Adapun beberapa hal yang dipelajari di dalam manipulasi data yaitu:

  • filtering: menyaring atau pengkondisian baris,
  • ordering: mengurutkan baris,
  • renaming: mengubah nama kolom,
  • adding: menambahkan kolom,
  • perhitungan statistik

Kita akan menggunakan salah satu paket/package yang populer yaitu dplyr, yang mana terdapat beberapa functions yang penting yang nantinya mempermudah dalam manipulasi data.

1.2.1 Paket R

Saya sarankan untuk meng-install paket tidyverse, yang mana semua kebutuhan dasar manipulasi sudah ada di dalamanya, seperi paket dplyr (untuk manipulasi data), paket readr untuk mempermudah membaca data, paket tidyr untuk tranforming data, dan paket ggplot2 untuk visualisasi data.

  • Instalasi:
install.packages("tidyverse")
  • Masukkan paket ke dalam environment-nya R:
library(tidyverse)

# atau

require(tidyverse)

1.2.2 Dataset

Kita akan menggunakan dataset yang sudah built-in di dalam R, yaitu iris. Yang mana dataset ini nanti kita konversi menjadi tibble (tbl_df) untuk analisis data yang lebih mudah. Objek tbl_df adalah sebuah data frame yang cara printing hasil (output) yang lebih bagus, ini cocok saat mengolah data jumlah besar.

library(tidyverse)

df <- as_tibble(iris)
df
## # A tibble: 150 x 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 
## # ... with 140 more rows

Terlihat output dengan konversi tibble lebih lengkap dan ringkas. Informasi yang muncul seperti terdapat 150 baris dan 5 kolom, tipe data setiap kolom, dan nomor indeks per baris.

1.3 Fungsi-fungsi Manipulasi Data

Terdapat 8 perintah dasar yang akan sangat digunakan dalam kegiatan manipulasi data. Semua fungsi-fungsi dibawah ini sudah termasuk di dalam paket dplyr.

  • filter(): Mengambil baris berdasarkan kondisi nilainya.
  • distinct(): Menghilangkan baris yang sama atau duplikat.
  • arrange(): Mengurutkan baris.
  • select(): Mengambil kolom berdasarkan nama kolomnya.
  • rename(): Mengubah nama kolom.
  • mutate(): Menambahkan atau membuat kolom baru dan menjaga kolom sama yang sudah ada.
  • transmute(): Menambahkan atau membuat kolom baru dan menghapus kolom yang sama atau sudah ada
  • summarise(): Melakukan komputasi statistika (Contoh: menghitung total (sum) atau rata-rata (mean))

2 Memanggil Kolom Data Frame

Pada bagian bab ini, akan dijelaskan bagaimana memanggil kolom dengan memanggil nama kolomnya atau posisi kolomnya. Akan dijelaskan juga bagaimana mengapus sebuah kolom dari data frame.

Adapun fungsi-fungsi yang akan digunakan seperti:

  • pull(): Mengambil hanya data atau isi dari kolom berupa vector.
  • select(): Memanggil satu atau lebih kolom berupda data table.
  • select_if(): Memanggil kolom dengan pengkondisian.
  • Helper functions - starts_with(), ends_with(), contains(), matches(), one_of(): Memanggil kolom berdasarkan kriteria tertentu atas nama kolomnya.

2.1 Paket yang Diperlukan

Masukkan paket tidyverse ke environment R atau RStudio.

library(tidyverse)

2.2 Konversi Dataset ke Tibble

Kita gunakan dataset built-in dari R yaitu iris. Konversi ke bentuk tibble untuk mempermudah analisis data.

df <- as_tibble(iris)
df
## # A tibble: 150 x 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 
## # ... with 140 more rows

2.3 Mengambil Isi Kolom

df %>% pull(Species)
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Catatan: Terdapat tanda %>% yaitu merupakan operator pipe atau biasa disebut piping. Operator pipe digunakan untuk mengambil apa yang ada sebelum pipe (%>%) dan diteruskan setelahnya. Contohnya seperti baris kode diatas, jika tidak menggunakan operator pipe perintahnya akan menjadi seperti: pull(df$species). Operator ini rekomendasi untuk digunakan.

2.4 Memanggil Kolom Berdasarkan Posisi

  • Memanggil kolom 1 sampai 3:
df %>% select(1:3)
  • Memanggil kolom 1 dan 3 tidak temasuk kolom 2:
df %>% select(1, 3)

2.5 Memanggil Kolom Berdasarkan Nama

  • Memanggil kolom yang bernama Sepal.Length dan Petal.Length
df %>% select(Sepal.Length, Petal.Length)
## # A tibble: 150 x 2
##    Sepal.Length Petal.Length
##           <dbl>        <dbl>
##  1          5.1          1.4
##  2          4.9          1.4
##  3          4.7          1.3
##  4          4.6          1.5
##  5          5            1.4
##  6          5.4          1.7
##  7          4.6          1.4
##  8          5            1.5
##  9          4.4          1.4
## 10          4.9          1.5
## # ... with 140 more rows
  • Memanggil semua kolom dari yang bernama Sepal.Length sampai Petal.Length
df %>% select(Sepal.Length:Petal.Length)
## # A tibble: 150 x 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
## # ... with 140 more rows
  • Memanggil kolom dengan helper function.
# Memanggil yang nama kolomnya diawali "Petal"
df %>% select(starts_with("Petal"))

# Memanggil yang nama kolomnya diakhiri "Width"
df %>% select(ends_with("Width"))

# Memanggil yang nama kolomnya terdapat "etal"
df %>% select(contains("etal"))
  
# Memanggil yang diantara nama kolomnya ada huruf "t"
df %>% select(matches(".t."))
  • Memanggil kolom dengan helper function. Yaitu memanggil diantara kolom yang dideklarasikan di dalam vektor.
# memanggil kolom yang di dalam vektor
df %>% select(one_of(c("Sepal.Length", "Petal.Length")))

2.6 Memanggil Kolom Berdasarkan Kondisi

Memanggil kolom dengan kondisi berarti dimana kolom yang terpanggil yang berkondisi TRUE.

Misal, hanya memanggil kolom yang bertipe numeric:

df %>% select_if(is.numeric)
## # A tibble: 150 x 4
##    Sepal.Length Sepal.Width Petal.Length Petal.Width
##           <dbl>       <dbl>        <dbl>       <dbl>
##  1          5.1         3.5          1.4         0.2
##  2          4.9         3            1.4         0.2
##  3          4.7         3.2          1.3         0.2
##  4          4.6         3.1          1.5         0.2
##  5          5           3.6          1.4         0.2
##  6          5.4         3.9          1.7         0.4
##  7          4.6         3.4          1.4         0.3
##  8          5           3.4          1.5         0.2
##  9          4.4         2.9          1.4         0.2
## 10          4.9         3.1          1.5         0.1
## # ... with 140 more rows

3 Menghapus Kolom

3.1 Menghapus Berdasarkan Nama

Untuk menghapus satu atau lebih kolom, diperlukan tanda minus -.

  • Menghapus kolom yang bernama Sepal.Length dan Petal.Length:
df %>% select(-Sepal.Length, -Petal.Length)
  • Menghapus semua kolom dari Sepal.Length sampai Petal.Length:
df %>% select(-(Sepal.Length:Petal.Length))
## # A tibble: 150 x 2
##    Petal.Width Species
##          <dbl> <fct>  
##  1         0.2 setosa 
##  2         0.2 setosa 
##  3         0.2 setosa 
##  4         0.2 setosa 
##  5         0.2 setosa 
##  6         0.4 setosa 
##  7         0.3 setosa 
##  8         0.2 setosa 
##  9         0.2 setosa 
## 10         0.1 setosa 
## # ... with 140 more rows
  • Menghapus semua yang nama kolomnya diawali dengan “Petal”:
df %>% select(-starts_with("Petal"))
## # A tibble: 150 x 3
##    Sepal.Length Sepal.Width Species
##           <dbl>       <dbl> <fct>  
##  1          5.1         3.5 setosa 
##  2          4.9         3   setosa 
##  3          4.7         3.2 setosa 
##  4          4.6         3.1 setosa 
##  5          5           3.6 setosa 
##  6          5.4         3.9 setosa 
##  7          4.6         3.4 setosa 
##  8          5           3.4 setosa 
##  9          4.4         2.9 setosa 
## 10          4.9         3.1 setosa 
## # ... with 140 more rows

3.2 Menghapus Berdasarkan Posisi

# Hapus kolom ke-1
df %>% select(-1)

# Hapus kolom ke-1 sampai ke-3
df %>% select(-(1:3))

# Hapus kolom ke-1 dan ke-2 tapi tidak kolom ke-2
df %>% select(-1, -3)

3.3 Kesimpulan

Pada latihan manipulasi data di awal ini, kita sudah mempelajari bagaimana mengambil, memanggil, mengapus kolom berdasarkan nama, kondisi, dan posisinya. Perlu diketahui karena dipakai perintah pipe maka dataset awal iris tidak hilang atau berubah. Kecuali beberapa langsung disimpan ke dalam variable misal, df <- select(-…) maka akan berubah strukturnya.

4 Subset Baris Data Frame

4.1 Pendahuluan

Pada bagian latihan ini akan dijelaskan bagaimana subset atau mengambil atau mengekstrak baris dari data frame berdasarkan kriteria tertentu.

Semua perintah yang digunakan dibawah ini terdapat dalam paket dplyr, tapi tentu sudah menggunakan paket tidyverse maka tidak perlu load paket lagi.

  • slice(): Mengambil baris berdasarkan posisinya.
  • filter(): Mengambil baris yang memenuhi kondisi sebuah logical/logika. Misal iris %>% filter(Sepal.Length > 6).
  • filter_all(), filter_if(), filter_at(): mem-filter semua kolom sesuai kondisi yang dideklarasikan di dalam fungsi. Untuk lebih jelasnya lihat contoh nanti.
  • sample_n(): Secara acak mengambil baris ke-n.
  • sample_frac(): Secara acak mengambil fraction/fraksi atau pecahan baris ke-n.
  • top_n(): Mengambil sebanyak n baris yang di bagian awal atau atas dan diurutkan berdasarkan sebuah kolom.

Dataset yang digunakan tetap iris dan pastikan juga sudah konversi ke tibble. Paket yang digunakan adalah tidyverse.

df <- as_tibble(iris)
df

4.2 Mengambil Baris Berdasarkan Posisi

  • Mengamgil baris ke-1 sampai ke-6:
df %>% slice(1:6)
## # A tibble: 6 x 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

4.3 Filter Baris Berdasarkan Logical Criteria

Sebelum lanjut, ada baiknya agar kita sama-sama mengerti apa itu perbandingan dan operator logika. Yang mana hal ini sangat penting urusan filtering.

4.3.1 Perbandingan Logika

Adapun operator perbandingan “logika” yang tersedia di R seperti berikut:

  1. Perbandingan logika (logical comparisons)
  • <: lebih kecil dari
  • >: lebih besar dari
  • <=: lebih kecil dari atau sama dengan
  • >=: lebih besar dari atau sama dengan
  • ==: yang sama dengan
  • !=: yang tidak sama dengan
  • %in%: yang ada di …. Contoh, “value %in% c(2, 3)” artinya value tersebut bisa mengambil 2 atau 3.
  • is.na(): yang ada NA; alias nilai yang hilang (missing value)
  • !is.na(): yang tidak ada NA; alias nilai yang tidak hilang.
  1. Operator logika (logical operators)
  • value == 2|3: artinya value tersebut sama dengan 2 atau (|) 3. value %in% c(2, 3) adalah cara cepat dari perintah value == 2|3.
  • &: artinya dan. Contoh: gender == “female” & age > 25

4.4 Mengambil Baris Berdasarkan Logical Criteria

  • Kriteria untuk satu kolom: Ambil baris yang dimana Sepal.Length > 7:
df %>% filter(Sepal.Length > 7)
## # A tibble: 12 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>    
##  1          7.1         3            5.9         2.1 virginica
##  2          7.6         3            6.6         2.1 virginica
##  3          7.3         2.9          6.3         1.8 virginica
##  4          7.2         3.6          6.1         2.5 virginica
##  5          7.7         3.8          6.7         2.2 virginica
##  6          7.7         2.6          6.9         2.3 virginica
##  7          7.7         2.8          6.7         2   virginica
##  8          7.2         3.2          6           1.8 virginica
##  9          7.2         3            5.8         1.6 virginica
## 10          7.4         2.8          6.1         1.9 virginica
## 11          7.9         3.8          6.4         2   virginica
## 12          7.7         3            6.1         2.3 virginica
  • Kriteria untuk banyak kolom: Ambil baris yang dimana Sepal.Length > 6.7 dan Sepal.Width ≤ 3:
df %>% filter(Sepal.Length > 6.7 & Sepal.Width <= 3)
## # A tibble: 10 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>     
##  1          6.8         2.8          4.8         1.4 versicolor
##  2          7.1         3            5.9         2.1 virginica 
##  3          7.6         3            6.6         2.1 virginica 
##  4          7.3         2.9          6.3         1.8 virginica 
##  5          6.8         3            5.5         2.1 virginica 
##  6          7.7         2.6          6.9         2.3 virginica 
##  7          7.7         2.8          6.7         2   virginica 
##  8          7.2         3            5.8         1.6 virginica 
##  9          7.4         2.8          6.1         1.9 virginica 
## 10          7.7         3            6.1         2.3 virginica
  • Pengecekan untuk yang sama: Ambil baris yang dimana Sepal.Length > 6.5 dan Species = “versicolor”:
df %>% filter(Sepal.Length > 6.5, Species == "versicolor")
## # A tibble: 8 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
## 1          7           3.2          4.7         1.4 versicolor
## 2          6.9         3.1          4.9         1.5 versicolor
## 3          6.6         2.9          4.6         1.3 versicolor
## 4          6.7         3.1          4.4         1.4 versicolor
## 5          6.6         3            4.4         1.4 versicolor
## 6          6.8         2.8          4.8         1.4 versicolor
## 7          6.7         3            5           1.7 versicolor
## 8          6.7         3.1          4.7         1.5 versicolor
  • Dengan OR operator (|): Ambil baris yang dimana Sepal.Length > 6.5 dan (Species = “versicolor” atau Species = “virginica”):
df %>% filter(Sepal.Length > 6.5, Species == "versicolor" | Species == "virginica")
## # A tibble: 30 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>     
##  1          7           3.2          4.7         1.4 versicolor
##  2          6.9         3.1          4.9         1.5 versicolor
##  3          6.6         2.9          4.6         1.3 versicolor
##  4          6.7         3.1          4.4         1.4 versicolor
##  5          6.6         3            4.4         1.4 versicolor
##  6          6.8         2.8          4.8         1.4 versicolor
##  7          6.7         3            5           1.7 versicolor
##  8          6.7         3.1          4.7         1.5 versicolor
##  9          7.1         3            5.9         2.1 virginica 
## 10          7.6         3            6.6         2.1 virginica 
## # ... with 20 more rows

Atau bisa dengan cara alternatif menggunakan operator %in%:

df %>% filter(Sepal.Length > 6.5, Species %in% c("versicolor", "virginica"))
## # A tibble: 30 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>     
##  1          7           3.2          4.7         1.4 versicolor
##  2          6.9         3.1          4.9         1.5 versicolor
##  3          6.6         2.9          4.6         1.3 versicolor
##  4          6.7         3.1          4.4         1.4 versicolor
##  5          6.6         3            4.4         1.4 versicolor
##  6          6.8         2.8          4.8         1.4 versicolor
##  7          6.7         3            5           1.7 versicolor
##  8          6.7         3.1          4.7         1.5 versicolor
##  9          7.1         3            5.9         2.1 virginica 
## 10          7.6         3            6.6         2.1 virginica 
## # ... with 20 more rows

4.5 Filter Baris di Dalam Baris

Bagian ini akan menggunakan 3 fungsi - filter_all(), filter_if() dan filter_at() - untuk menyaring beberapa baris dengan kondisi dari baris itu sendiri.

Buat data frame baru dari variabel df dengan menghapus kolom “Species”:

df2 <- df %>% select(-Species)
  • Ambil baris yang dimana semua barisnya (variables) lebih besar dari 2.4:
df2 %>% filter_all(all_vars(. > 2.4))
## # A tibble: 3 x 4
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
##          <dbl>       <dbl>        <dbl>       <dbl>
## 1          6.3         3.3          6           2.5
## 2          7.2         3.6          6.1         2.5
## 3          6.7         3.3          5.7         2.5
  • Ambil baris yang mana saat semua barisnya (variables) lebih besar dari 2.4:
df2 %>% filter_all(any_vars(. > 2.4))
## # A tibble: 150 x 4
##    Sepal.Length Sepal.Width Petal.Length Petal.Width
##           <dbl>       <dbl>        <dbl>       <dbl>
##  1          5.1         3.5          1.4         0.2
##  2          4.9         3            1.4         0.2
##  3          4.7         3.2          1.3         0.2
##  4          4.6         3.1          1.5         0.2
##  5          5           3.6          1.4         0.2
##  6          5.4         3.9          1.7         0.4
##  7          4.6         3.4          1.4         0.3
##  8          5           3.4          1.5         0.2
##  9          4.4         2.9          1.4         0.2
## 10          4.9         3.1          1.5         0.1
## # ... with 140 more rows

Maksud perintah diatas (fungsi any_vars()) adalah mencari kolom dan baris yang nilainya lebih besar dari 2.4 namun tidak semua nilai dibuat TRUE alias diatas 2.4. Jika dengan fungsi all_vars() maka semua nilai sifatnya wajib diatas 2.4. Sedangkan any_vars(), sesuai namanya any artinya fungsi mencari nilai namun tidak semua hasilnya sesuai atau diatas 2.4.

Jika fungsi any_vars() dijalankan, fungsi ini mencari secara bertahap. Jika sudah ditemukan nilai yang diatas 2.4 maka selanjutnya dicari yang sedikit diatas 2.4, lalu yang sama dengan 2.4 lalu yang dibawah 2.4 dan seterusnya. Kalau dalam bahas inggrisnya, deskripsi kode diatas adalah “Select rows when any of the variables are greater than 2.4”.

Untuk mudah lebih dapat gambaran, lihat link ini di bagian nomor 9.2.1

Atau mungkin jika ada yang bisa menjelaskan lebih detil atau mungkin bisa memberikan referensi yang cocok, bisa ditulis di kolom komentar.

  • Menggabungkan dua fungsi untuk filtering baris. Gabungan ini dengan fungsi filter_at() yang mengambil spesifikasi vars().
df2 %>% filter_at(vars(starts_with("Sepal")), any_vars(. > 2.4))
## # A tibble: 150 x 4
##    Sepal.Length Sepal.Width Petal.Length Petal.Width
##           <dbl>       <dbl>        <dbl>       <dbl>
##  1          5.1         3.5          1.4         0.2
##  2          4.9         3            1.4         0.2
##  3          4.7         3.2          1.3         0.2
##  4          4.6         3.1          1.5         0.2
##  5          5           3.6          1.4         0.2
##  6          5.4         3.9          1.7         0.4
##  7          4.6         3.4          1.4         0.3
##  8          5           3.4          1.5         0.2
##  9          4.4         2.9          1.4         0.2
## 10          4.9         3.1          1.5         0.1
## # ... with 140 more rows

Baris kode diatas menyaring kolom yang diawali “Sepal”. Kolom Petal.Length dan Petal.Width ikut ter-filter karena ada barisnya yang lebih kecil dari 2.4 dan lebih besar dari 2.4, ini karena digunakan fungsi any_vars().

4.6 Menghapus Missing Values

Sebelum itu, kita buat sebuah data frame yang ada missing value-nya. Di bahasa R, NA (Not Available) digunakan untuk merepresentasikan nilai yang hilang. Berikut baris kode untuk membuat data frame-nya:

# Membuat data frame dengan missing values
data_orang <-
  data_frame(
    nama = c("Andre", "Bambang", "Chandra", "Donita"),
    umur = c(27, 25, 29, 26),
    tinggi = c(180, NA, NA, 169),
    menikah = c("ya", "ya", "tidak", "tidak")
  )

# Print
data_orang
## # A tibble: 4 x 4
##   nama     umur tinggi menikah
##   <chr>   <dbl>  <dbl> <chr>  
## 1 Andre      27    180 ya     
## 2 Bambang    25     NA ya     
## 3 Chandra    29     NA tidak  
## 4 Donita     26    169 tidak
  • Ambil baris yang mana tingginya ada NA:
data_orang %>% filter(is.na(tinggi))
## # A tibble: 2 x 4
##   nama     umur tinggi menikah
##   <chr>   <dbl>  <dbl> <chr>  
## 1 Bambang    25     NA ya     
## 2 Chandra    29     NA tidak
  • Hapus baris yang mana tingginya ada NA:
data_orang %>% filter(!is.na(tinggi))
## # A tibble: 2 x 4
##   nama    umur tinggi menikah
##   <chr>  <dbl>  <dbl> <chr>  
## 1 Andre     27    180 ya     
## 2 Donita    26    169 tidak

Maksud !is.na() adalah cari data yang NA dan hilangkan.

4.7 Mengambil Baris Secara Acak dari Data Frame

Kita bisa ambil baris dan jumlahnya secara acak atau random. Menggunakan fungsi sample_n() atau mengambil fraksi/pecahan secara acak dengan fungsi sample_frac(). Tapi sebelum itu, harus dideklarasikan sebuah fungsi, yaitu fungsi set.seed() yang mana bertindak sebagai Random Generator Number (RGN) dan penyimpan nilai yang akan diambil secara acak.

  • Mengambil 5 baris secara acak tanpa ada yang berulang (replacement):
set.seed(1234)

df %>% sample_n(5, replace = FALSE)
## # A tibble: 5 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
## 1          5.2         3.5          1.5         0.2 setosa    
## 2          5.7         2.6          3.5         1   versicolor
## 3          6.3         3.3          6           2.5 virginica 
## 4          6.5         3.2          5.1         2   virginica 
## 5          6.3         3.4          5.6         2.4 virginica

Penjelasan baris kode diatas yaitu:

  • fungsi set.seed() menyimpan nilai sebanyak 1,234
  • nilai dari fungsi set.seed() akan diambil secara acak sebanyak 5 dari variabel df
  • argumen replace = FALSE memastikan tidak ada data yang berulang. Untuk lebih mudah paham, lihat contoh di bawah:
print(sample(c(2,5,3), size=3, replace=FALSE))
## [1] 2 5 3
print(sample(c(2,5,3), size=3, replace=TRUE))
## [1] 5 3 5

Kode diatas memakai fungsi sample(), jika memakai fungsi sample_n() tidak akan jalan karena sample_n() butuh input-an data frame, bukan vector. Namun proses dan prinsipnya tetap sama.

  • Mengambil 5% baris, secara acak tanpa ada yang berulang (replacement):
set.seed(1234)

df %>% sample_frac(0.05, replace = FALSE)
## # A tibble: 8 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
## 1          5.2         3.5          1.5         0.2 setosa    
## 2          5.7         2.6          3.5         1   versicolor
## 3          6.3         3.3          6           2.5 virginica 
## 4          6.5         3.2          5.1         2   virginica 
## 5          6.3         3.4          5.6         2.4 virginica 
## 6          6.4         2.8          5.6         2.2 virginica 
## 7          6.8         3.2          5.9         2.3 virginica 
## 8          7.9         3.8          6.4         2   virginica

4.8 Mengambil Baris Teratas

  • Ambil 5 baris teratas dan urutkan berdasarkan kolom Sepal.Length:
df %>% top_n(5, Sepal.Length)
## # A tibble: 5 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>    
## 1          7.7         3.8          6.7         2.2 virginica
## 2          7.7         2.6          6.9         2.3 virginica
## 3          7.7         2.8          6.7         2   virginica
## 4          7.9         3.8          6.4         2   virginica
## 5          7.7         3            6.1         2.3 virginica
  • Ambil 5 baris teratas di-group-kan dengan kolom Species dan urutkan berdasarkan kolom Sepal.Length:
df %>% group_by(Species) %>% top_n(5, Sepal.Length)
## # A tibble: 16 x 5
## # Groups:   Species [3]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>     
##  1          5.8         4            1.2         0.2 setosa    
##  2          5.7         4.4          1.5         0.4 setosa    
##  3          5.7         3.8          1.7         0.3 setosa    
##  4          5.5         4.2          1.4         0.2 setosa    
##  5          5.5         3.5          1.3         0.2 setosa    
##  6          7           3.2          4.7         1.4 versicolor
##  7          6.9         3.1          4.9         1.5 versicolor
##  8          6.7         3.1          4.4         1.4 versicolor
##  9          6.8         2.8          4.8         1.4 versicolor
## 10          6.7         3            5           1.7 versicolor
## 11          6.7         3.1          4.7         1.5 versicolor
## 12          7.7         3.8          6.7         2.2 virginica 
## 13          7.7         2.6          6.9         2.3 virginica 
## 14          7.7         2.8          6.7         2   virginica 
## 15          7.9         3.8          6.4         2   virginica 
## 16          7.7         3            6.1         2.3 virginica

4.9 Kesimpulan

Pada bahasan dan latihan bab Subset Baris Data Frame, kita sudah mempelajari cukup dalam tentang bagaimana filtering sebuah data frame menggunakan paket dplyr ataupun tidyverse. Adapun ringkasan yang kita pelajari bersama yaitu:

  • Filter baris dengan logical criteria: my_data %>% filter(Sepal.Length > 7)
  • Select baris secara acak: my_data %>% sample_n(10)
  • Select fraksi secara acak: my_data %>% sample_frac(10)
  • Select baris teratas dengan nilainya: my_data %>% top_n(10, Sepal.Length)

5 Mengidentifikasi dan Menghapus Data Duplikat

5.1 Pendahuluan

Pada bab ini akan dijelaskan bagaimana cara mengidentifikasi (identify) dan menghapus (remove) duplikasi data di bahasa R.

Kita bersama akan belajar menggunakan fungsi base dari R dan dari paket dplyr yang akan dipakai:

  1. Fungsi dari base R. Yaitu fungsi yang sudah ada atau built-in di RStudio tanpa perlu menggunakan paket yang lain.
  • duplicated(): untuk mengidentifikasi duplikasi data dan
  • unique(): untuk mengambil data yang unik alias tidak duplikat,
  1. Fungsi dari paket dplyr:
  • distinct(): untuk menghapus data yang duplikat.

Tetap package dan dataset yang digunakan adalah tidyverse dan iris.

5.2 Mencari dan Menghilangkan yang Duplikat

Fungsi duplicated() dari R akan memberikan output logika yaitu TRUE dengan bentuk vector bila ada yang duplikat.

Contoh, saya buat variable x yang berisi vector enam angka.

x <- c(2, 2, 5, 4, 5, 7)
  • Mencari posisi yang ada duplikat di variabel x:
duplicated(x)
## [1] FALSE  TRUE FALSE FALSE  TRUE FALSE
  • Ambil data yang duplikat:
x[duplicated(x)]
## [1] 2 5
  • Hapus data yang duplikat:
x[!duplicated(x)]
## [1] 2 5 4 7
  • Dengan cara yang masih sama, kita bisa menghapus baris yang duplikat dari sebuah data frame berdasarkan kolomnya, seperi berikut:
df[!duplicated(df$Sepal.Width), ]
## # A tibble: 23 x 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          4.4         2.9          1.4         0.2 setosa 
##  9          5.4         3.7          1.5         0.2 setosa 
## 10          5.8         4            1.2         0.2 setosa 
## # ... with 13 more rows

5.3 Mengambil Data yang Unique

Diberikan sebuah vector seperti dibawah:

x <- c(2, 2, 5, 4, 5, 7)

Kita bisa ambil data yang unique; berbeda dan tidak berulang, dengan perintah:

unique(x)
## [1] 2 5 4 7

Fungsi unique() juga dapat diaplikasikan pada sebuah data frame seperti berikut:

unique(df)
## # A tibble: 149 x 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 
## # ... with 139 more rows

5.4 Menghapus Baris yang Duplikat di Data Frame

Fungsi distinct() bisa digunakan untuk menyimpan hanya data yang unik atau tidak berulang dari sebuah data frame. Jika ada duplikasi baris, hanya baris pertama yang disimpan. Ini versi yang lebih efisien dari fungsi unique().

  • Menghapus duplikasi baris berdasarkan semua kolomnya:
df %>% distinct()
## # A tibble: 149 x 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 
## # ... with 139 more rows
  • Menghapus duplikasi baris berdasarkan kolom tertentu (single variable):
df %>% distinct(Sepal.Length, .keep_all = TRUE)
## # A tibble: 35 x 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.4         2.9          1.4         0.2 setosa 
##  8          4.8         3.4          1.6         0.2 setosa 
##  9          4.3         3            1.1         0.1 setosa 
## 10          5.8         4            1.2         0.2 setosa 
## # ... with 25 more rows

Argumen .keep_all bila dibuat TRUE maka semua kolom tetap disimpan. Bila dibuat FALSE maka hanya kolom yang diklarasikan yang disimpan.

  • Menghapus duplikasi baris berdasarkan kolomm-kolom tertentu (multiple variables):
df %>% distinct(Sepal.Length, Petal.Width, .keep_all = TRUE)
## # A tibble: 110 x 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          4.4         2.9          1.4         0.2 setosa 
##  9          4.9         3.1          1.5         0.1 setosa 
## 10          5.4         3.7          1.5         0.2 setosa 
## # ... with 100 more rows

5.5 Perbedaan Unique dan Distinct

Apa perbedaan unique() dengan distinct()?

unique() merupakan fungsi dari base R. Untuk jumlah data frame yang besar prosesnya kemungkinan akan lebih lambat.

distinct() merupakan fungsi di dalam paket dplyr, dan bisa di-custom fungsinya. Fungsi ini secara konsiderasi memang lebih cepat prosesnya.

Coba lihat dua perbandingan kedua perintah dibawah antara unique() dan distinct(). Keduanya sama-sama mengambil kolom Petal.Width dan Species.

unique(iris[c("Petal.Width", "Species")])
##     Petal.Width    Species
## 1           0.2     setosa
## 6           0.4     setosa
## 7           0.3     setosa
## 10          0.1     setosa
## 24          0.5     setosa
## 44          0.6     setosa
## 51          1.4 versicolor
## 52          1.5 versicolor
## 54          1.3 versicolor
## 57          1.6 versicolor
## 58          1.0 versicolor
## 70          1.1 versicolor
## 71          1.8 versicolor
## 74          1.2 versicolor
## 78          1.7 versicolor
## 101         2.5  virginica
## 102         1.9  virginica
## 103         2.1  virginica
## 104         1.8  virginica
## 105         2.2  virginica
## 107         1.7  virginica
## 111         2.0  virginica
## 115         2.4  virginica
## 116         2.3  virginica
## 120         1.5  virginica
## 130         1.6  virginica
## 135         1.4  virginica
distinct(iris, Petal.Width, Species)
##    Petal.Width    Species
## 1          0.2     setosa
## 2          0.4     setosa
## 3          0.3     setosa
## 4          0.1     setosa
## 5          0.5     setosa
## 6          0.6     setosa
## 7          1.4 versicolor
## 8          1.5 versicolor
## 9          1.3 versicolor
## 10         1.6 versicolor
## 11         1.0 versicolor
## 12         1.1 versicolor
## 13         1.8 versicolor
## 14         1.2 versicolor
## 15         1.7 versicolor
## 16         2.5  virginica
## 17         1.9  virginica
## 18         2.1  virginica
## 19         1.8  virginica
## 20         2.2  virginica
## 21         1.7  virginica
## 22         2.0  virginica
## 23         2.4  virginica
## 24         2.3  virginica
## 25         1.5  virginica
## 26         1.6  virginica
## 27         1.4  virginica

Perbedaannya yaitu fungsi unique() memberikan label berupa nomor indeks dimana data unik pertama yang disimpan, sedangkan fungsi distinct() memberikan label indeks normal.

5.6 Kesimpulan

Pada bab ini, kita mempelajari fungsi-fungsi inti dalam mengidentifikasi dan menghapus data yang duplikat. Adapun ringkasan yang dipelajar yaitu:

  • Menghapus duplikasi baris berdasarkan satu atau lebih kolom (variables): df %>% dplyr::distinct(Sepal.Length)
  • Menggunakan fungsi base R untuk mengambil elemen yang unik dari sebuah vektor dan data frame: unique(df)
  • Menggunakan fungsi base R untuk melihat apakah TRUE atau FALSE adanya duplikas: duplicated(df)

6 Mengurutkan Ulang (Reorder) Baris dari Data Frame

Bab ini menjelaskan tentang bagaimana mengurutkan ulang/reorder atau sort baris, di sebuah tabel untuk satu atau lebih kolom.

Maksud mengurutkan ulang baris disini adalah dimana sebuah dataset (contoh: iris) sudah berurutan dengan sesuai kondisi dari sananya, atau barisnya sudah disusun sedimikian rupa sesuai dari penyedia dan pembuat dataset itu. Maka menyusun ulang disini mengurutkan kembali dataset tersebut sesuai dengan kondisi dan susunan yang kita inginkan. Hence namanya reorder.

Disini kita akan belajar bagaimana mudahnya untuk:

  • Mengurutkan baris dari sebuah data frame dengan susunan ascending (dari kecil ke besar) menggunakan fungsi arrange() dari paket dplyr.
  • Mengurutkan baris dengan susunan descending (dari besar ke kecil) menggunakan fungsi arrange() dikombinasikan dengan fungsi desc() dari paket dplyr.

6.1 Mengurutkan Baris

  • Mengurutkan baris untuk kolom Sepal.Length dengan susunan ascending:
df %>% arrange(Sepal.Length)
## # A tibble: 150 x 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 
## # ... with 140 more rows

Secara default, fungsi arrange() mengurutan dengan nilai kecil ke besar alias ascending.

  • Mengurutkan baris untuk kolom Sepal.Length dengan susunan descending:
df %>% arrange(desc(Sepal.Length))
## # A tibble: 150 x 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
## # ... with 140 more rows

Ada juga cara lain untuk menyusun. Kita bisa gunakan tanda minus (-) untuk menyusun baris secara descending. Seperti berikut:

arrange(df, -Sepal.Length)
## # A tibble: 150 x 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
## # ... with 140 more rows
  • Mengurutkan baris untuk dua kolom; Sepal.Length dan Sepal.Width:
df %>% arrange(Sepal.Length, Sepal.Width)
## # A tibble: 150 x 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.2          1.4         0.2 setosa 
##  8          4.6         3.4          1.4         0.3 setosa 
##  9          4.6         3.6          1           0.2 setosa 
## 10          4.7         3.2          1.3         0.2 setosa 
## # ... with 140 more rows
# Untuk descencing order, tinggal tambahkan function desc()

Catata: Jika ada data yang hilang atau kosong (missing values) posisinya selalu di akhir baris.

6.2 Kesimpulan

Di bab ini kita belajar bagaimana mengurutkan baris data frame menggunakan fungsi arrange() dari paket dplyr.

7 Mengubah Nama Kolom Data Frame

7.1 Pendahuluan

Bagian bab ini, kita akan belajar bagaimana mengubah (rename) nama kolom pada sebuah data frame di bahasa R. Hal ini bisa mudah dilakukan dengan fungsi rename() dari paket dplyr. Bisa juga dilakukan dengan fungsi base dari R, namun butup perintah yang lebih panjang.

7.2 Mengubah Nama Kolom

  • Menggunakan dplyr::rename()

Mengubah nama kolom Sepal.Length menjadi sepal_length dan Sepal.Width menjadi sepal_width:

df %>%
  rename(
    sepal_length = Sepal.Length,
    sepal_width = Sepal.Width
    )
## # A tibble: 150 x 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 
## # ... with 140 more rows

Catata: perintah dengan dplyr::rename() berarti memanggil fungsi rename() tanpa harus load paket dplyr ke dalam RStudio, namun paket tetap harus di-install terlebih dahulu. Cara ini biasa digunakan untuk sekali jalan atau one-time use jika ingin melakukan operasi yang instan.

  • Menggunakan fungsi base R

Untuk mengubah nama kolom Sepal.Length menjadi sepal_length, prosedurnya adalah sebagai berikut:

  1. Ambil nama kolomnya dengan fungsi names() atau colnames()
  2. Ubah naman kolomnya dimana nama = Sepal.Length
colnames(df)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
names(df)[names(df) == "Sepal.Length"] <- "sepal_length"
names(df)[names(df) == "Sepal.Width"] <- "sepal_width"

df
## # A tibble: 150 x 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 
## # ... with 140 more rows

Atau, bisa juga dengan cara lebih mudah dibaca, dimana mengubah nama kolom dengan index-nya. Seperti berikut:

names(df)[1] <- "sepal.length"
names(df)[2] <- "sepal_width"

7.3 Kesimpulan

Di bab ini, kita sudah mempelajari bagaiman mengubah nama satu atau lebih kolom di sebuah data frame menggunakan fungsi rename() dari paket dplyr dan juga dengan fungsi dari base R.

8 Mengubah Baris Data Frame

8.1 Pendahuluan

Pada bab sebelum ini, dijelaskan untuk perubahan nama kolom dengan fungsi dari paket dplyr. Bab ini akan dijelaskan bagaimana kita bisa mengubah baris atau isi baris, seperti tambarh baris, hapus baris, dan ubah nilai baris. Istilahnya kita alter baris tersebut bila mana ada merasa data ada yang kurang sesuai dan perlu dirubah.

8.2 Mengubah Data Baris

Kasus pertama, misal, ubah data pada kolom Species di dataset iris agar data setosa menjadi Setosa (huruf S kapital). Perintahnya:

# Menggunakan mutate
df %>% mutate(ifelse(test = Species == "setosa", yes = "Setosa", no = Species))
## # A tibble: 150 x 6
##    sepal_length sepal_width Petal.Length Petal.Width Species `ifelse(test = Spe~
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>   <chr>              
##  1          5.1         3.5          1.4         0.2 setosa  Setosa             
##  2          4.9         3            1.4         0.2 setosa  Setosa             
##  3          4.7         3.2          1.3         0.2 setosa  Setosa             
##  4          4.6         3.1          1.5         0.2 setosa  Setosa             
##  5          5           3.6          1.4         0.2 setosa  Setosa             
##  6          5.4         3.9          1.7         0.4 setosa  Setosa             
##  7          4.6         3.4          1.4         0.3 setosa  Setosa             
##  8          5           3.4          1.5         0.2 setosa  Setosa             
##  9          4.4         2.9          1.4         0.2 setosa  Setosa             
## 10          4.9         3.1          1.5         0.1 setosa  Setosa             
## # ... with 140 more rows
# Menggunakan transmute
df %>% transmute(ifelse(test = Species == "setosa", yes = "Setosa", no = Species))
## # A tibble: 150 x 1
##    `ifelse(test = Species == "setosa", yes = "Setosa", no = Species)`
##    <chr>                                                             
##  1 Setosa                                                            
##  2 Setosa                                                            
##  3 Setosa                                                            
##  4 Setosa                                                            
##  5 Setosa                                                            
##  6 Setosa                                                            
##  7 Setosa                                                            
##  8 Setosa                                                            
##  9 Setosa                                                            
## 10 Setosa                                                            
## # ... with 140 more rows

Kasus kedua, kita buat tibble baru dengan data seperti dibawah.

datakau <- tibble(nim = c(1021, 1022, 1023, 1024, 1025),
                  nama = c("Asaf", "Diani", "Ulfa", "Harris", "Hanif"),
                  jk = c("laki2", "perempuan", "perempuan", "laki2", "laki-laki"))

datakau
## # A tibble: 5 x 3
##     nim nama   jk       
##   <dbl> <chr>  <chr>    
## 1  1021 Asaf   laki2    
## 2  1022 Diani  perempuan
## 3  1023 Ulfa   perempuan
## 4  1024 Harris laki2    
## 5  1025 Hanif  laki-laki
  • Ubah nim yang bernama Harris menjadi 1204. Perintahnya:
# Cara indexing
datakau[4,1] <- 1204
datakau
## # A tibble: 5 x 3
##     nim nama   jk       
##   <dbl> <chr>  <chr>    
## 1  1021 Asaf   laki2    
## 2  1022 Diani  perempuan
## 3  1023 Ulfa   perempuan
## 4  1204 Harris laki2    
## 5  1025 Hanif  laki-laki
  • Ubah jenis kelamin (kolom jk) dari laki2 menjadi laki-laki:
datakau[c(1,4), 3] <- "laki-laki"
datakau
## # A tibble: 5 x 3
##     nim nama   jk       
##   <dbl> <chr>  <chr>    
## 1  1021 Asaf   laki-laki
## 2  1022 Diani  perempuan
## 3  1023 Ulfa   perempuan
## 4  1204 Harris laki-laki
## 5  1025 Hanif  laki-laki
  • Tambah data data baru di tibble datakau. Datanya sebagai berikut: 1026, “Alif”, “laki-laki”. Menggunakan fungsi add_row() dari paket dplyr, perintahnya:
# Menggunakan fungsi dplyr
datakau <- add_row(datakau, nim = 1026, nama = "Alif", jk = "laki-laki")
datakau
## # A tibble: 6 x 3
##     nim nama   jk       
##   <dbl> <chr>  <chr>    
## 1  1021 Asaf   laki-laki
## 2  1022 Diani  perempuan
## 3  1023 Ulfa   perempuan
## 4  1204 Harris laki-laki
## 5  1025 Hanif  laki-laki
## 6  1026 Alif   laki-laki
  • Tambahkan kolom alamat dan tambahkan datanya.
datakau$alamat <- c("Cirebon", "Jakarta", "Yogyakarta", "Jakarta", "Bali", "Bali")
datakau
## # A tibble: 6 x 4
##     nim nama   jk        alamat    
##   <dbl> <chr>  <chr>     <chr>     
## 1  1021 Asaf   laki-laki Cirebon   
## 2  1022 Diani  perempuan Jakarta   
## 3  1023 Ulfa   perempuan Yogyakarta
## 4  1204 Harris laki-laki Jakarta   
## 5  1025 Hanif  laki-laki Bali      
## 6  1026 Alif   laki-laki Bali
  • Hapus semua data yang berasosiasi dengan nama Hanif.
datakau[-5, ]
## # A tibble: 5 x 4
##     nim nama   jk        alamat    
##   <dbl> <chr>  <chr>     <chr>     
## 1  1021 Asaf   laki-laki Cirebon   
## 2  1022 Diani  perempuan Jakarta   
## 3  1023 Ulfa   perempuan Yogyakarta
## 4  1204 Harris laki-laki Jakarta   
## 5  1026 Alif   laki-laki Bali

8.3 Kesimpulan

Kesimpulan tidak saya tulis. Anda bisa coba menyimpulkan apa yang telah dipelajar bersama pada bab ini. Terima kasih.

9 Komputasi dan Menambah Kolom di Data Frame

9.1 Pendahuluan

Bab ini menjelaskan bagaimana melakukan komputasi (istilahnya perhitungan) dan menambahkan variabel atau kolom baru pada sebuah data frame. Di bab sebelumnya sudah ada satu contoh penambahan kolom tapi di bab ini yang akan difokuskan lebih jauh.

Adapun fungsi-fungsi yang digunakan untuk melakukan hal yang disebutkan diatas adalah:

  • mutate(): compute atau menghitung dan menambahkan variable ke dalam tabel. Fungsi ini menyimpan kolom serupa yang sudah ada (exist).
  • transmute(): compute atau menghitung dan menambahkan variable tapi menghapus kolom serupa yang sudah ada.

Akan ada juga digunakan kombinasi beberapa fungsi untuk mutate() dan transmute(), seperti:

  • mutate_all() / transmute_all(): fungsi yang memproses semua kolom.
  • mutate_at() / transmute_at(): fungsi yang memproses kolom spesifik.
  • mutate_if() / transmute_if(): fungsi memproses dengan suatu kondisi.

9.2 Fungsi mutate() pada Kolom

Menambahkan kolom baru (sepal_bagi_petal_l) tanpa menghapus kolom yang serupa:

df %>% mutate(sepal_bagi_petal_l = Sepal.Length / Petal.Length)
## # A tibble: 150 x 6
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sepal_bagi_petal_l
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>                <dbl>
##  1          5.1         3.5          1.4         0.2 setosa                3.64
##  2          4.9         3            1.4         0.2 setosa                3.5 
##  3          4.7         3.2          1.3         0.2 setosa                3.62
##  4          4.6         3.1          1.5         0.2 setosa                3.07
##  5          5           3.6          1.4         0.2 setosa                3.57
##  6          5.4         3.9          1.7         0.4 setosa                3.18
##  7          4.6         3.4          1.4         0.3 setosa                3.29
##  8          5           3.4          1.5         0.2 setosa                3.33
##  9          4.4         2.9          1.4         0.2 setosa                3.14
## 10          4.9         3.1          1.5         0.1 setosa                3.27
## # ... with 140 more rows

9.3 Fungsi transmute() pada Kolom

Menambahkan kolom baru (sepal_bagi_petal_l, sepal_bagi_petal_w) dan hapus kolom yang serupa:

df %>%
  transmute(
    sepal_bagi_petal_l = Sepal.Length/Petal.Length,
    sepal_bagi_petal_w = Sepal.Width/Petal.Width
  )
## # A tibble: 150 x 2
##    sepal_bagi_petal_l sepal_bagi_petal_w
##                 <dbl>              <dbl>
##  1               3.64              17.5 
##  2               3.5               15   
##  3               3.62              16   
##  4               3.07              15.5 
##  5               3.57              18   
##  6               3.18               9.75
##  7               3.29              11.3 
##  8               3.33              17   
##  9               3.14              14.5 
## 10               3.27              31   
## # ... with 140 more rows

9.4 Mengubah Beberapa Kolom Sekaligus

Kita awali dengan membuat variabel baru yaitu df2, yang hanya berisi kolom bertipe numeric. Untuk melakukannya, kita hilangkan kolom Species dengan perintah berikut:

df2 <- df %>% select(-Species)

Fungsi-fungsi seperti mutate_all()/transmute_all(), mutate_at()/transmute_at(), dan mutate_if()/transmute_if() dapat digunakan untuk mengubah beberapa kolom sekaligus.

Formatnya simpel seperti berikut:

# Varian fungsi mutate
mutate_all(.tbl, .funs, ...)
mutate_if(.tbl, .predicate, .funs, ...)
mutate_at(.tbl, .vars, .funs, ...)

# Varian fungsi transmute
transmute_all(.tbl, .funs, ...)
transmute_if(.tbl, .predicate, .funs, ...)
transmute_at(.tbl, .vars, .funs, ...)

Dimana:

  • .tbl: Object tbl atau table.
  • .funs: Daftar fungsi-fungsi yang akan dipanggil oleh funs(), atau vektor fungsi, atau mudahnya yaitu sebuah fungsi.
  • : Argumen tambahan untuk pemanggil fungsi oleh .funs.
  • predicate: Sebuah fungsi predicate atau predikat atau kondisi yang diaplikasikan ke dalam kolom atau logical vector. Kolom-kolomnya yang mana bernilai TRUE itulah yang dipanggil.

Setelah ini langsung kita coba latihan bagaimana implementasi varian fungsi dari mutate(). Untuk varian dari transmute() bisa ditulis dengan format yang sama.

9.5 Ubah Semua Nilai pada Semua Kolom

  • Bagi semua kolom dengan 2.54:
df2 %>% mutate_all(funs(./2.54))
## # A tibble: 150 x 4
##    Sepal.Length Sepal.Width Petal.Length Petal.Width
##           <dbl>       <dbl>        <dbl>       <dbl>
##  1         2.01        1.38        0.551      0.0787
##  2         1.93        1.18        0.551      0.0787
##  3         1.85        1.26        0.512      0.0787
##  4         1.81        1.22        0.591      0.0787
##  5         1.97        1.42        0.551      0.0787
##  6         2.13        1.54        0.669      0.157 
##  7         1.81        1.34        0.551      0.118 
##  8         1.97        1.34        0.591      0.0787
##  9         1.73        1.14        0.551      0.0787
## 10         1.93        1.22        0.591      0.0394
## # ... with 140 more rows

Catatan: tanda titik (. ) mewakili semua kolom/variables.

  • Bagi semua kolom dengan 2.54 namun dibuat di kolom baru setelahnya:
df2 %>% mutate_all(funs(cm = ./2.54))
## # A tibble: 150 x 8
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length_cm
##           <dbl>       <dbl>        <dbl>       <dbl>           <dbl>
##  1          5.1         3.5          1.4         0.2            2.01
##  2          4.9         3            1.4         0.2            1.93
##  3          4.7         3.2          1.3         0.2            1.85
##  4          4.6         3.1          1.5         0.2            1.81
##  5          5           3.6          1.4         0.2            1.97
##  6          5.4         3.9          1.7         0.4            2.13
##  7          4.6         3.4          1.4         0.3            1.81
##  8          5           3.4          1.5         0.2            1.97
##  9          4.4         2.9          1.4         0.2            1.73
## 10          4.9         3.1          1.5         0.1            1.93
## # ... with 140 more rows, and 3 more variables: Sepal.Width_cm <dbl>,
## #   Petal.Length_cm <dbl>, Petal.Width_cm <dbl>

Total kolom menjadi 8 karena bila diberi nama, pada kasus ditas yaitu cm, maka otomatis .funs membuat kolom baru dan memasukkan kata “cm” di akhir setiap nama kolom sebagai pembeda.

9.6 Ubah Nilai pada Kolom Tertentu

  • mutate_at(): mengubah kolom yang dipilih dengan nama kolomnya:
df %>% mutate_at(c("Sepal.Length", "Petal.Width"), funs(cm = ./2.54))
## # A tibble: 150 x 7
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_cm
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>             <dbl>
##  1          5.1         3.5          1.4         0.2 setosa             2.01
##  2          4.9         3            1.4         0.2 setosa             1.93
##  3          4.7         3.2          1.3         0.2 setosa             1.85
##  4          4.6         3.1          1.5         0.2 setosa             1.81
##  5          5           3.6          1.4         0.2 setosa             1.97
##  6          5.4         3.9          1.7         0.4 setosa             2.13
##  7          4.6         3.4          1.4         0.3 setosa             1.81
##  8          5           3.4          1.5         0.2 setosa             1.97
##  9          4.4         2.9          1.4         0.2 setosa             1.73
## 10          4.9         3.1          1.5         0.1 setosa             1.93
## # ... with 140 more rows, and 1 more variable: Petal.Width_cm <dbl>
  • mutate_if(): mengubah kolom yang dipilih dengan fungsi predicate:

mutate_if() juga sangat berguna untuk mengubah tipe suatu kolom.

df %>% mutate_if(is.factor, as.character)
## # 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

Membulatkan semua nilai pada kolom bertipe numeric:

df %>% mutate_if(is.numeric, round, digits = 0)
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1            5           4            1           0 setosa 
##  2            5           3            1           0 setosa 
##  3            5           3            1           0 setosa 
##  4            5           3            2           0 setosa 
##  5            5           4            1           0 setosa 
##  6            5           4            2           0 setosa 
##  7            5           3            1           0 setosa 
##  8            5           3            2           0 setosa 
##  9            4           3            1           0 setosa 
## 10            5           3            2           0 setosa 
## # ... with 140 more rows

Untuk informasi lebih banyak apa saja argumen bisa ditambah dalam varian fungsi dari mutate() bisa cek di sini dan sini.

9.7 Kesimpulan

Di bab ini menjelaskan bagaimana menambahkan kolom baru ke data frame menggunakan fungsi dari paket dplyr, yaitu: mutate(), transmute(), dan variannya.

  • mutate(iris, sepal = 2*Sepal.Length): Perhitungan dan menambahkan kolom.
  • transmute(iris, sepal = 2*Sepal.Length): Membuat beberapa kolom baru dan menghapus yang sudah ada.

10 Komputasi Ringkasan Statistik

Atau lebih kerennya pakai bahasa inggirs; compute summary statistics.

10.1 Pendahuluan

Di bab ini akan meperkenalkan cara bagaimana compute atau melakukan komputasi perhitungan statistical summary atau sebuah ringkasan statistik di bahasa pemrograman R dengan paket dplyr.

Kita akan belajar, bagaimana:

  • Melakukan komputasi ringkasan statistik untuk data yang mencar (belum dikelompokkan), dan juga untuk data yang sudah dikelompokkan dengan satu atau lebih kolom. Fungsi R-nya: summarise() dan group_by().
  • Summarise atau meringkaskan beberapa variables/kolom. Fungsi R-nya:
    • summarise_all(): mengaplikasikan fungsi summary pada setiap kolom di data frame.
    • summarise_at(): mengaplikasikan fungsi summary pada kolom yang dipilih dengan character vector.
    • summarise_if(): mengaplikasikan fungsi summary pada kolom yang dipilih dengan fungsi predicate. Lihat bab Ubah Nilai pada Kolom Tertentu.

10.2 Summary Statistics untuk Ungrouped Data

10.2.1 Mengelompokkan dengan Satu Kolom/Variable

df %>%
  group_by(Species) %>%
  summarise(count = n(),
            mean_sep = mean(Sepal.Length),
            mean_pet = mean(Petal.Length)
            )
## # A tibble: 3 x 4
##   Species    count mean_sep mean_pet
## * <fct>      <int>    <dbl>    <dbl>
## 1 setosa        50     5.01     1.46
## 2 versicolor    50     5.94     4.26
## 3 virginica     50     6.59     5.55

Dimana:

  • group_by(): untuk mengelompokkan data berdasarkan suatu baris.
  • summarise(): fungsi komputasi atau perhitungan statistik.
  • count, mean_sep, mean_pet: nama kolom sebagai penyimpan hasil komputasi.
  • n(): merupakan argumen tambahan (additional argument) di dalam fungsi summarise() untuk mencari jumlah total.
  • mean(): merupakan argumen tambahan dan fungsi untuk mencari nilai rata-rata.

10.2.2 Mengelompokkan dengan Beberapa Kolom/Variables

Untuk yang bagian ini, kita pakai dataset ToothGrowth.

# Dataset pertumbuhan gigi a.k.a ToothGrowth
head(ToothGrowth)
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5
# Komputasi summarize
ToothGrowth %>%
  group_by(supp, dose) %>%
  summarise(n = n(),
            mean = mean(len),
            sd = sd(len)
            )
## # A tibble: 6 x 5
## # Groups:   supp [2]
##   supp   dose     n  mean    sd
##   <fct> <dbl> <int> <dbl> <dbl>
## 1 OJ      0.5    10 13.2   4.46
## 2 OJ      1      10 22.7   3.91
## 3 OJ      2      10 26.1   2.66
## 4 VC      0.5    10  7.98  2.75
## 5 VC      1      10 16.8   2.52
## 6 VC      2      10 26.1   4.80

Dimana:

  • sd(): merupakan argumen tambahan untuk mencari standard deviation atau standar deviasi atau simpangan baku.

10.3 Summarise Beberapa Kolom

  • Hitung mean atau rata-rata pada semua kolom/variables.
df %>% group_by(Species) %>% summarise_all(mean)
## # A tibble: 3 x 5
##   Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
## * <fct>             <dbl>       <dbl>        <dbl>       <dbl>
## 1 setosa             5.01        3.43         1.46       0.246
## 2 versicolor         5.94        2.77         4.26       1.33 
## 3 virginica          6.59        2.97         5.55       2.03
  • Hitung mean atau rata-rata pada kolom/variables yang dipilih dengan character vector:
df %>% group_by(Species) %>% summarise_at(c("Sepal.Length", "Sepal.Width"), mean, na.rm = TRUE)
## # A tibble: 3 x 3
##   Species    Sepal.Length Sepal.Width
## * <fct>             <dbl>       <dbl>
## 1 setosa             5.01        3.43
## 2 versicolor         5.94        2.77
## 3 virginica          6.59        2.97
  • Hitung mean atau rata-rata pada kolom/variables yang dipilih dengan fungsi predicate:
df %>% group_by(Species) %>% summarise_if(is.numeric, mean, na.rm = TRUE)
## # A tibble: 3 x 5
##   Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
## * <fct>             <dbl>       <dbl>        <dbl>       <dbl>
## 1 setosa             5.01        3.43         1.46       0.246
## 2 versicolor         5.94        2.77         4.26       1.33 
## 3 virginica          6.59        2.97         5.55       2.03

10.4 Fungsi Komputasi

Subbab ini memberikan beberapa fungsi R untuk melakukan komputasi statistik. Seperti pada baris-baris kode sebelumnya, kita bisa berlatih mencoba menggunakan fungsi-fungsi ini untuk spesifik mencari hasil diinginkan.

Mengukur rata-rata:

  • mean(x): total dari x dibagi banyaknya x
  • median(x): mencari nilai tengah

Mengukur variasi:

  • sd(x): standar deviasi; mencari simpangan baku
  • IQR(x): interquartile range adalah kuartil pertama dikurangi kuartil ketiga
  • mad(x): median absolute deviation untuk mengukur penyebaran data

Mengukur nilai:

  • min(x): nilai minimum x
  • max(x): nilai maksimum x
  • quantile(x, 0.25): 25% nya x dibawah nilai ini

Mengukur posisi:

  • first(x): panjang x kolom pertama dengan hasil berupa vector
  • nth(x, 2): persis dengan perintah n <- 2; x[n]
  • last(x): panjang x dengan hasil berupa vector

Jumlah:

  • n(x): banyaknya x
  • sum(!is.na(x)): banyaknya x yang tidak NA atau missing values
  • n_distinct(x): banyaknya nilai unik x

Jumlah dengan nilai logika:

  • sum(x > 10): menghitung banyaknya x yang diatas 10
  • mean(y == 0): menghitung banyaknya x yang sama dengan 0

10.5 Kesimpulan

Menggunakan fungsi summarise() dan group_by() untuk komputasi atau perhitungan statistik.

11 Penutup

Berikut beberapa referensi untuk belajar bahasa pemrograman R dan manipulasi data:

Anda juga dapat silaturahmi ke channel YouTube saya, yang membahas seputar ilmu di dunia IT terutama yang saya minati. Termasuk tentang data. Channel-nya adalah Dhuki ID.

Sekian dan terima kasih.