Topik ini membahas tipe data dasar R, yaitu numeric, integer, character, dan logical, beserta dua fungsi pemeriksa tipenya, typeof() dan class(). Bahasan juga mencakup konversi tipe yang terjadi otomatis ketika tipe dicampur, serta NA sebagai penanda data yang tidak tersedia. Setelah membacanya, tipe setiap nilai dapat diperiksa, akibat pencampuran tipe dapat diantisipasi, dan kehadiran NA dapat ditangani dengan tepat.
Empat tipe dasar#
R menyimpan setiap nilai dengan tipe tertentu, dan tipe menentukan operasi mana yang sah atas nilai itu. Angka dapat dihitung, teks dapat dirangkai, sedangkan nilai kebenaran mengendalikan logika. Empat tipe yang paling dasar adalah bilangan pecahan, bilangan bulat, teks, dan nilai kebenaran. Fungsi typeof() melaporkan tipe penyimpanan sebuah nilai:
typeof(85)
typeof(85L)
typeof("Ali")
typeof(TRUE)[1] "double"
[1] "integer"
[1] "character"
[1] "logical"Angka 85 tanpa akhiran disimpan sebagai double, yaitu bilangan pecahan berpresisi ganda. Akhiran L pada 85L menandai bilangan bulat sehingga tipenya integer, dan akhiran itu ditulis menempel pada angkanya. Teks yang diapit tanda kutip bertipe character, sedangkan nilai kebenaran TRUE dan FALSE bertipe logical. Dalam praktik analisis data, bilangan yang dibaca dari berkas pun umumnya tiba sebagai double, sehingga tipe inilah yang paling sering ditemui. Tipe yang jarang dipakai analisis data sehari-hari, seperti complex dan raw, tidak dibahas di sini.
Memeriksa tipe dengan typeof() dan class()#
Selain typeof(), R menyediakan fungsi class() yang melaporkan label kelas sebuah objek. Keduanya sering memberikan jawaban yang sama, tetapi keduanya menjawab pertanyaan yang berbeda. Untuk angka, jawabannya memang dapat berbeda:
class(85)
class(85L)
85 == 85L[1] "numeric"
[1] "integer"
[1] TRUER menyebut seluruh bilangan pecahan dengan label numeric pada tingkat kelas, sedangkan typeof() membedakan penyimpanannya menjadi double dan integer. Nilai 85 dan 85L sama besarnya, sebagaimana ditunjukkan perbandingan ==, tetapi keduanya disimpan dengan cara yang berbeda. Untuk pekerjaan analisis sehari-hari, perbedaan ini jarang mengganggu karena R mengonversi keduanya secara otomatis saat keduanya dioperasikan bersama. Kebiasaan yang baik adalah menggunakan class() saat memeriksa data, dan menyediakan typeof() bila cara penyimpanannya yang perlu dipastikan. Label kelas bukan sekadar catatan, karena fungsi generik seperti print() memilih perlakuannya berdasarkan kelas objek yang diterimanya. Apabila pertanyaannya berbentuk ya atau tidak, keluarga fungsi is.numeric(), is.integer(), is.character(), dan is.logical() menjawabnya secara langsung.
Konversi tipe saat mencampur#
Fungsi c() tidak menolak tipe yang bercampur, tetapi menyatukannya ke satu tipe menurut urutan yang tetap: logical lebih dahulu, kemudian numeric, dan terakhir character. Rantai berikut memperlihatkan konversi bertahap tersebut:
c(TRUE, FALSE)
c(TRUE, FALSE, 1)
c(TRUE, FALSE, 1, "satu")[1] TRUE FALSE
[1] 1 0 1
[1] "TRUE" "FALSE" "1" "satu"Vektor pertama murni logical. Penambahan angka 1 mengubah TRUE menjadi 1 dan FALSE menjadi 0, sehingga tipenya menjadi numeric. Penambahan teks “satu” mengubah seluruh elemen menjadi character, termasuk angkanya. Urutan ini berarti hanya character yang mampu menampung semuanya, karena teks dapat mewakili angka maupun nilai kebenaran. Konversi ini tidak merusak isi, tetapi menurunkan kemampuan analisisnya: TRUE yang telah menjadi 1 tidak lagi diketahui logical, dan 1 yang telah menjadi teks tidak dapat dihitung. Karena itu vektor atomik dijaga tetap satu tipe, dan tipe vektor hasil impor diperiksa dengan class() sebelum dihitung.
NA sebagai penanda data hilang#
Nilai yang tidak tersedia ditandai dengan NA, singkatan dari not available. NA bukan nol, bukan teks kosong, dan bukan pesan error. NA adalah penanda resmi R untuk data yang hilang atau tidak diukur, dan vektor tetap memuat NA sebagai salah satu elemennya. Vektor berikut mencatat nilai ujian lima siswa, dengan satu siswa tidak mengikuti ujian:
nilai <- c(85, 90, NA, 92, 88)
nilai
is.na(nilai)[1] 85 90 NA 92 88
[1] FALSE FALSE TRUE FALSE FALSEKeluaran memuat NA apa adanya, dan fungsi is.na() menandai posisinya dengan TRUE. Hasil is.na() adalah vektor logical sepanjang vektor aslinya, sehingga setiap elemen memperoleh keterangan hilang atau tidak. Perbandingan biasa tidak dapat digunakan untuk mendeteksi NA, karena nilai == NA menghasilkan NA, bukan TRUE atau FALSE. Tanda NA juga ikut terbawa dalam operasi apa pun yang melibatkan vektornya, sebagaimana diperlihatkan berikut ini.
NA pada fungsi statistik#
Perhatikan dua baris pertama keluaran berikut, lalu bandingkan dengan dua baris terakhirnya:
mean(nilai)
sum(nilai)
mean(nilai, na.rm = TRUE)
sum(nilai, na.rm = TRUE)[1] NA
[1] NA
[1] 88.75
[1] 355Satu NA cukup membuat hasil agregasi ikut menjadi NA. Perilaku ini disengaja. Rata-rata yang salah satu datanya tidak diketahui memang tidak dapat ditentukan, sehingga R menolak mengarang angka dan mengembalikan NA. Agar elemen yang hilang diabaikan, fungsi statistik menerima argumen na.rm = TRUE, yang singkatnya berarti hapus NA sebelum menghitung. Argumen ini tersedia pada fungsi agregasi standar seperti mean(), sum(), min(), dan max(), sehingga pola penanganannya seragam di seluruh fungsi tersebut. Angka 88.75 dihitung dari empat nilai yang tersisa, yaitu 85, 90, 92, dan 88, yang jumlahnya 355.
Kesalahan umum#
Kesalahan yang paling sering terjadi adalah mencoba mendeteksi NA dengan perbandingan biasa. Ekspresi nilai == NA tidak menghasilkan posisi data yang hilang, melainkan vektor berisi NA, karena pertanyaan apakah nilai yang tidak diketahui sama dengan nilai yang tidak diketahui memang tidak terjawab. Alat yang tepat adalah is.na(), sebagaimana digunakan pada bagian sebelumnya. Kesalahan kedua menyangkut penulisan bilangan bulat. Akhiran L ditulis menempel pada angkanya tanpa spasi, karena penulisan yang terpisah seperti 85 L dibaca sebagai dua hal yang berbeda dan bukan lagi satu bilangan bulat. Perlu pula diingat bahwa rentang integer terbatas, sedangkan double jauh lebih luas, sehingga sebagian besar pekerjaan analisis secara alami menetap pada double. Kesalahan semacam ini tidak terdeteksi pada saat menulis kode, melainkan pada saat membaca ulang keluaran yang angkanya tidak masuk akal.
Ringkasan#
- Empat tipe dasar R adalah double yang berlabel numeric, integer dengan akhiran L, character, dan logical.
typeof()melaporkan tipe penyimpanan, sedangkanclass()melaporkan label kelas objek.- Pencampuran tipe dalam
c()mengonversi seluruh elemen menurut urutan logical, numeric, lalu character. - NA adalah penanda data hilang yang ikut terbawa ke hasil agregasi, dan
na.rm = TRUEmenyuruh fungsi mengabaikannya.
Referensi#
- R Language Definition — CRAN — Menguraikan tipe dasar R beserta aturan konversi otomatisnya.
- An Introduction to R — CRAN — Bagian missing values menjelaskan NA pada vektor dan perilakunya dalam perhitungan.