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.
siswa <- data.frame(
nama = c("Ali", "Budi", "Citra", "Dewi"),
kelas = c("11A", "11A", "11B", "11B"),
nilai = c(80, 85, 78, 90)
)
siswa nama kelas nilai
1 Ali 11A 80
2 Budi 11A 85
3 Citra 11B 78
4 Dewi 11B 90Cetakan data frame klasik menampilkan nomor baris di sisi kiri tanpa informasi tipe kolom. Kolom diakses dengan tanda $, dan kelas hasilnya mengikuti isi kolomnya.
class(siswa$kelas)
class(siswa$nilai)[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.
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── 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 90Cetakan 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.
tibble(x = 1:3, y = x^2)# A tibble: 3 × 2
x y
<int> <dbl>
1 1 1
2 2 4
3 3 9Kedua, 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).
names(data.frame("nilai akhir" = c(80, 85)))
names(tibble("nilai akhir" = c(80, 85)))[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.
besar <- tibble(
id = 1:25,
nilai = 60 + id * 2
)
besar# 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 rowsKonversi 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.
as_tibble(siswa)# 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 90Kolom baru ditambahkan dengan penugasan lewat tanda $, dan panjangnya harus sama dengan jumlah baris.
siswa_tbl$lulus <- siswa_tbl$nilai >= 80
siswa_tbl# 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 TRUEKolom 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.
data.frame(nama = c("Ali", "Budi"), nilai = c(80, 85, 78))Error in data.frame(nama = c("Ali", "Budi"), nilai = c(80, 85, 78)) : arguments imply differing number of rows: 2, 3Pesan 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.
tibble(x = 1:3, y = z^2)Error: object 'z' not foundRingkasan#
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, danas.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 rowssaat pembuatan.
Referensi#
- tibble: Simple Data Frames — tidyverse — dokumentasi resmi paket tibble beserta perilaku pembuatan dan cetaknya.
- An Introduction to R — CRAN — bagian Lists and data frames menjelaskan data frame klasik.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — menggunakan tibble sebagai format data utama sepanjang bukunya.