Tipe data di R
Setiap nilai di R punya salah satu dari sekumpulan kecil tipe atomik. Empat di antaranya melakukan hampir semua pekerjaan:
- double: bilangan desimal, seperti
3.14,-2,1e6. Inilah yang dimaksud R dengan "numeric", dan ini default untuk angka apa pun yang kamu ketik. - integer: bilangan bulat yang disimpan secara pasti, ditulis dengan akhiran
L:42L. - character: teks di dalam tanda kutip:
"hello". - logical: dua nilai kebenaran
TRUEdanFALSE(plusNA, nilai yang hilang; lihat nilai yang hilang).
Ada juga complex (2 + 3i) untuk sesekali perhitungan pemrosesan sinyal; kamu bisa bertahun-tahun tanpa membutuhkannya. typeof() memberi tahu tipe sebuah nilai:
Perhatikan baris pertama: angka biasa adalah double meskipun terlihat bulat. typeof(42) adalah "double"; hanya 42L yang integer. Dalam analisis sehari-hari perbedaannya jarang penting (R mengonversi di antara keduanya diam-diam), tapi ini menjelaskan banyak output typeof() yang kalau tidak begitu terasa membingungkan.
typeof() vs class(): mengapa keduanya berbeda
R punya dua fungsi yang sama-sama terlihat menjawab "ini apa?", padahal keduanya menjawab pertanyaan yang sedikit berbeda.
typeof()melaporkan tipe penyimpanan: bagaimana nilai itu tersimpan di memori.class()melaporkan tipe perilaku: label yang dipakai mekanisme method dispatch R untuk memutuskan, misalnya,printatausummarymana yang dijalankan.
Untuk nilai sederhana, jawabannya hanya berbeda istilah:
typeof() mengatakan double (penyimpanannya), class() mengatakan numeric (perilakunya). Untuk struktur, jaraknya makin lebar:
Matrix itu disimpan sebagai integer vector biasa, tapi berperilaku sebagai matrix: class()-lah yang memberi tahu R untuk mencetaknya sebagai kisi. Pemisahan yang sama muncul pada data frame (typeof mengatakan "list", class mengatakan "data.frame") dan tanggal (typeof mengatakan "double", class mengatakan "Date").
Aturan praktisnya: pakai class() saat kamu ingin tahu sesuatu itu apa dalam arti sehari-hari, dan typeof() saat kamu sedang debug apa yang dilakukan R di balik layar.
Memeriksa tipe dengan is.*()
Setiap tipe punya predikat pasangannya yang mengembalikan TRUE atau FALSE, berguna di dalam fungsi yang perlu memvalidasi input-nya:
Satu jebakan yang perlu kamu tahu: is.numeric() bernilai TRUE untuk double dan integer (keduanya angka), tapi is.integer() memeriksa penyimpanannya, jadi hasilnya FALSE untuk 42 biasa:
Kalau kamu pernah heran bahwa is.integer(7) bernilai FALSE untuk angka yang jelas-jelas bilangan bulat secara matematika, inilah alasannya. 7 adalah double; 7L adalah integer.
Mengonversi tipe dengan as.*()
Konversi eksplisit memakai keluarga as.*, satu fungsi untuk setiap tipe tujuan:
Ada dua perilaku yang perlu diingat. as.integer() memotong ke arah nol, bukan membulatkan: 7.9 menjadi 7. Dan saat konversi tidak masuk akal, R tidak memunculkan error; R mengembalikan NA dan memberikan warning:
Jalankan itu dan kamu akan melihat NA plus warning "NAs introduced by coercion". Ini sebenarnya berguna: ubah seluruh kolom teks yang berantakan menjadi angka, maka isian yang tidak bisa dibaca menjadi NA alih-alih membuat skripmu crash. Tapi ini juga berarti NA bisa diam-diam masuk ke datamu. Saat sebuah konversi penting, periksa apakah ada NA baru setelahnya.
Nilai logical dikonversi ke dan dari angka sesuai harapan: as.numeric(TRUE) adalah 1, as.logical(0) adalah FALSE. Itulah sebabnya sum() dari logical vector menghitung jumlah TRUE:
Koersi implisit: aturan satu tipe untuk vector
Vector atomik di R hanya bisa menampung satu tipe. Gabungkan nilai yang bercampur dengan c(), maka R diam-diam menaikkan semuanya ke tipe paling fleksibel yang ada, mengikuti tangga yang tetap:
logical → integer → double → character
Nilai logical menjadi 1 dan 0, integer menjadi double, dan di baris terakhir semuanya menjadi teks: character selalu menang, karena nilai apa pun bisa ditulis sebagai string. Kamu bisa memastikannya dengan typeof():
Koersi adalah sumber nomor satu bug "kenapa kolomku jadi teks?": satu string "N/A" yang nyasar di kolom angka memaksa seluruh vector menjadi character. Saat itu terjadi, perbaiki dulu nilai penyebabnya, lalu konversi kembali dengan as.numeric().
Yang kamu bawa pulang
- Empat tipe andalan: double ("numeric"), integer (
42L), character, logical. typeof()= cara disimpan;class()= cara berperilaku.3.14adalahdoubleyang berperilaku sebagainumeric.- Periksa dengan
is.numeric()dan kawan-kawannya; konversi denganas.numeric()dan kawan-kawannya. Konversi yang gagal menghasilkanNAdengan warning, bukan error. - Vector hanya menampung satu tipe; mencampur tipe memicu koersi sepanjang logical → integer → double → character.
Berikutnya: melihat lebih dekat tipe numerik, yaitu pembulatan, fungsi matematika, dan kejutan floating-point yang dialami setiap bahasa.
Pertanyaan yang sering diajukan
Apa saja tipe data dasar di R?
Tipe atomiknya adalah double (bilangan desimal, yang disebut R sebagai "numeric"), integer (bilangan bulat yang ditulis dengan akhiran L, seperti 42L), character (teks di dalam tanda kutip), logical (TRUE/FALSE), dan complex yang jarang dipakai. Semua struktur yang lebih besar, seperti vector, data frame, dan list, dibangun dari tipe-tipe ini.
Apa perbedaan typeof() dan class() di R?
typeof() melaporkan cara sebuah nilai disimpan di memori (tipe tingkat rendahnya); class() melaporkan nilai itu berperilaku sebagai apa, yang menentukan method mana yang dipanggil R. Untuk bilangan desimal biasa, keduanya hanya berbeda istilah: typeof(3.14) adalah "double" sedangkan class(3.14) adalah "numeric". Untuk struktur seperti data frame, typeof() mengatakan "list" sedangkan class() mengatakan "data.frame".
Bagaimana cara mengonversi tipe data di R?
Pakai keluarga as.*: as.numeric("3.5") menghasilkan 3.5, as.character(42) menghasilkan "42", as.integer(7.9) memotong menjadi 7. Saat konversi tidak mungkin dilakukan, R mengembalikan NA dan memunculkan warning, bukan error: as.numeric("abc") hasilnya NA.
Apa itu koersi di R?
Saat kamu menggabungkan tipe yang berbeda dalam satu vector, R diam-diam mengubah semuanya ke tipe yang paling fleksibel, mengikuti urutan logical → integer → double → character. Jadi c(1, 2, "three") menjadi character vector: "1" "2" "three".