Data frame dan tibble

Data frame dan tibble sebagai andalan utama analisis data di R.

Daftar isi

Data frame adalah struktur utama untuk data tabular di R, yaitu kumpulan kolom yang masing-masing boleh bertipe berbeda tetapi panjangnya sama. Paket tidyverse menyediakan varian modern bernama tibble yang menyempurnakan beberapa perilaku data frame klasik. Topik ini membahas pembuatan keduanya, perbedaan perilaku yang penting diketahui, konversi di antara keduanya, serta penambahan kolom baru.

Data frame klasik dengan data.frame()#

Fungsi data.frame() membentuk data frame dari argumen-argumen berupa vektor, satu argumen menjadi satu kolom, dan seluruh vektornya harus sama panjang.

r Contoh: membuat data frame klasik
siswa <- data.frame(
  nama = c("Ali", "Budi", "Citra", "Dewi"),
  kelas = c("11A", "11A", "11B", "11B"),
  nilai = c(80, 85, 78, 90)
)
siswa
text Keluaran
   nama kelas nilai
1   Ali   11A    80
2  Budi   11A    85
3 Citra   11B    78
4  Dewi   11B    90

Cetakan data frame klasik menampilkan nomor baris di sisi kiri tanpa informasi tipe kolom. Kolom diakses dengan tanda $, dan kelas hasilnya mengikuti isi kolomnya.

r Contoh: tipe kolom data frame
class(siswa$kelas)
class(siswa$nilai)
text Keluaran
[1] "character"
[1] "numeric"

Kolom teks di atas bertipe character, bukan faktor. Perilaku ini berlaku sejak R 4.0, sedangkan pada R versi lama data.frame() secara bawaan mengubah setiap kolom teks menjadi faktor melalui argumen stringsAsFactors = TRUE. Perubahan bawaan ini penting diketahui apabila membaca ulang kode lama yang bergantung pada perilaku faktor tersebut.

tibble dari tidyverse#

Paket tibble, yang ikut dimuat bersama tidyverse, menyediakan fungsi tibble() sebagai pembuat data frame modern. Perbedaan dengan data frame klasik langsung terlihat dari cetakannya.

r Contoh: membuat tibble
library(tidyverse)
siswa_tbl <- tibble(
  nama = c("Ali", "Budi", "Citra", "Dewi"),
  kelas = c("11A", "11A", "11B", "11B"),
  nilai = c(80, 85, 78, 90)
)
siswa_tbl
text Keluaran
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.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
# A tibble: 4 × 3
  nama  kelas nilai
  <chr> <chr> <dbl>
1 Ali   11A      80
2 Budi  11A      85
3 Citra 11B      78
4 Dewi  11B      90

Cetakan tibble menampilkan ukurannya di baris pertama, tipe setiap kolom di bawah namanya, dan hanya sepuluh baris pertama apabila datanya panjang. Kolom teks dibiarkan bertipe character, dan nama kolom tidak diubah sama sekali. Objek tibble tetap merupakan data frame dalam arti luas, sehingga fungsi analisis data yang menerima data frame umumnya juga menerima tibble.

Perilaku tibble yang membedakannya#

Tiga perilaku membedakan tibble dari data frame klasik. Pertama, kolom dapat saling merujuk saat pembuatan, yaitu kolom yang disebutkan lebih dahulu langsung digunakan untuk menghitung kolom berikutnya.

r Contoh: kolom baru merujuk kolom sebelumnya
tibble(x = 1:3, y = x^2)
text Keluaran
# A tibble: 3 × 2
      x     y
  <int> <dbl>
1     1     1
2     2     4
3     3     9

Kedua, nama kolom tidak diubah. Fungsi data.frame() secara bawaan menyunting nama yang mengandung spasi agar sah sebagai nama variabel, sedangkan tibble membiarkannya apa adanya. Pada cetakan tibble, nama semacam itu diapit tanda kutip miring (backtick).

r Contoh: nama kolom dengan spasi
names(data.frame("nilai akhir" = c(80, 85)))
names(tibble("nilai akhir" = c(80, 85)))
text Keluaran
[1] "nilai.akhir"
[1] "nilai akhir"

Ketiga, cetakannya selalu ringkas. Data frame klasik mencetak seluruh barisnya, sedangkan tibble hanya mencetak sepuluh baris pertama dan menandai sisanya.

r Contoh: cetakan ringkas tibble
besar <- tibble(
  id = 1:25,
  nilai = 60 + id * 2
)
besar
text Keluaran
# A tibble: 25 × 2
      id nilai
   <int> <dbl>
 1     1    62
 2     2    64
 3     3    66
 4     4    68
 5     5    70
 6     6    72
 7     7    74
 8     8    76
 9     9    78
10    10    80
# ℹ 15 more rows

Konversi dan penambahan kolom#

Data frame yang sudah ada diubah menjadi tibble dengan as_tibble() tanpa mengubah isinya, dan jalan sebaliknya memakai as.data.frame() bila ada fungsi yang menuntut data frame klasik.

r Contoh: mengubah data frame menjadi tibble
as_tibble(siswa)
text Keluaran
# A tibble: 4 × 3
  nama  kelas nilai
  <chr> <chr> <dbl>
1 Ali   11A      80
2 Budi  11A      85
3 Citra 11B      78
4 Dewi  11B      90

Kolom baru ditambahkan dengan penugasan lewat tanda $, dan panjangnya harus sama dengan jumlah baris.

r Contoh: menambahkan kolom baru
siswa_tbl$lulus <- siswa_tbl$nilai >= 80
siswa_tbl
text Keluaran
# A tibble: 4 × 4
  nama  kelas nilai lulus
  <chr> <chr> <dbl> <lgl>
1 Ali   11A      80 TRUE
2 Budi  11A      85 TRUE
3 Citra 11B      78 FALSE
4 Dewi  11B      90 TRUE

Kolom lulus bertipe logical, yaitu TRUE untuk nilai minimal 80 dan FALSE untuk sisanya. Penambahan dengan cara ini cocok untuk satu atau dua kolom, sedangkan pembuatan banyak kolom sekaligus lebih rapi dilakukan dengan fungsi mutate() dari dplyr.

Kesalahan umum#

Kesalahan paling sering saat membentuk tabel adalah vektor yang panjangnya tidak sama. Pesan errornya muncul seketika pada pembuatan.

r Contoh: panjang kolom yang tidak sama
data.frame(nama = c("Ali", "Budi"), nilai = c(80, 85, 78))
text Keluaran
Error in data.frame(nama = c("Ali", "Budi"), nilai = c(80, 85, 78)) : arguments imply differing number of rows: 2, 3

Pesan arguments imply differing number of rows berarti argumennya tidak dapat disusun menjadi tabel karena panjangnya bertentangan. Periksa panjang setiap vektor dengan length() apabila sumber kesalahannya tidak terlihat.

Kesalahan lain adalah merujuk kolom yang belum ada saat pembuatan tibble. Tibble menghitung kolomnya berurutan, sehingga rujukan hanya boleh ke kolom yang sudah terbentuk sebelumnya, seperti tibble(x = 1:3, y = z^2) pada contoh berikut.

r Contoh: merujuk kolom yang belum ada
tibble(x = 1:3, y = z^2)
text Keluaran
Error: object 'z' not found

Ringkasan#

  • data.frame() membentuk tabel dari vektor-vektor yang sama panjang, dan sejak R 4.0 kolom teksnya tidak lagi diubah menjadi faktor.
  • tibble() dari tidyverse membiarkan teks tetap character, mempertahankan nama kolom, merujuk kolom sebelumnya saat pembuatan, dan mencetak ringkas.
  • as_tibble() mengubah data frame menjadi tibble, dan as.data.frame() mengembalikannya.
  • Kolom baru ditambahkan dengan penugasan $, dengan panjang yang sama seperti jumlah baris.
  • Panjang kolom yang tidak sama menghasilkan error arguments imply differing number of rows saat pembuatan.

Referensi#