Menu

Tipe data di R: numeric, character, logical (typeof & class)

Tipe data atomik di R (double, integer, character, logical), perbedaan typeof() dan class(), serta cara kerja konversi dan koersi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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 TRUE dan FALSE (plus NA, 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, print atau summary mana 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.14 adalah double yang berperilaku sebagai numeric.
  • Periksa dengan is.numeric() dan kawan-kawannya; konversi dengan as.numeric() dan kawan-kawannya. Konversi yang gagal menghasilkan NA dengan 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".

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai