Topik ini membahas vektor (vector), struktur data paling mendasar di R. Pembahasan mencakup pembuatan vektor dengan fungsi c(), sifat atomik yang mengharuskan seluruh elemen bertipe sama, pemberian nama pada elemen, serta pengambilan sebagian isi vektor dengan tanda kurung siku. Setelah membacanya, vektor dapat dibuat, diperiksa panjang dan tipenya, diberi nama, dan diambil elemennya dengan benar.
Membuat vektor dengan fungsi c()#
Fungsi c() menggabungkan sejumlah nilai menjadi satu vektor. Huruf c merupakan singkatan dari combine, yakni menggabungkan. Argumen yang diberikan menjadi elemen-elemen vektor hasil, dan urutannya dipertahankan sebagaimana dituliskan.
c(85, 90, 78, 92, 88)[1] 85 90 78 92 88Vektor yang akan digunakan berulang kali disimpan ke dalam objek dengan penugasan <-, sama seperti nilai tunggal. Panjang vektor diperiksa dengan fungsi length().
nilai <- c(85, 90, 78, 92, 88)
length(nilai)[1] 5Segala sesuatu di R adalah vektor, dan pernyataan ini harus dibaca harfiah. Angka tunggal sekalipun sesungguhnya vektor dengan panjang satu, sehingga ekspresi aritmetika sederhana seperti 2 + 3 sesungguhnya menghitung vektor satu elemen. Itulah sebabnya keluaran konsol selalu diawali indeks posisi, dan itulah pula sebabnya operasi aritmetika berlaku sama untuk angka tunggal maupun vektor dengan panjang berapa pun.
Vektor juga dapat memuat teks. Setiap elemen teks diapit tanda kutip pada penulisannya:
nama <- c("Ali", "Budi", "Citra", "Dewi", "Eka")
nama[1] "Ali" "Budi" "Citra" "Dewi" "Eka"Keluaran menampilkan setiap elemen diapit tanda kutip ganda karena elemennya bertipe character, yaitu tipe teks. Pada saat menulis kode, kutip ganda dan kutip tunggal sama-sama diterima, tetapi keluaran selalu menampilkan kutip ganda.
Vektor atomik: satu tipe untuk semua elemen#
Vektor yang dibuat dengan c() bersifat atomik (atomic), artinya seluruh elemennya bertipe sama. Vektor nilai seluruhnya angka, sedangkan nama seluruhnya teks. Apabila tipe yang berbeda dicampur, R tidak menolaknya, melainkan mengonversi seluruh elemen ke satu tipe yang cakupannya paling luas.
c(85, 90, "absen")[1] "85" "90" "absen"Angka 85 dan 90 berubah menjadi teks "85" dan "90", sehingga vektor hasilnya tidak dapat dihitung ulang. Aturan atomik tetap terpenuhi karena kini seluruh elemen bertipe sama, tetapi informasi tipe aslinya hilang. Konversi semacam ini berlangsung diam-diam, sehingga tipe vektor perlu diperiksa apabila data bersumber dari masukan yang bercampur.
Tipe vektor diperiksa dengan fungsi class():
class(nilai)
class(nama)[1] "numeric"
[1] "character"Satu vektor menghasilkan satu label karena memang hanya memuat satu tipe. Label numeric menandai vektor angka, sedangkan character menandai vektor teks. Label yang diperoleh berlaku untuk seluruh elemen, dan perubahan satu elemen saja sudah mengganti label vektornya, sebagaimana terlihat pada contoh pencampuran sebelumnya.
Memberi nama pada elemen#
Elemen vektor dapat diberi nama melalui fungsi names(). Nama menjadikan keluaran lebih mudah dibaca karena setiap angka langsung menyebut pemiliknya, misalnya nilai ujian siswa tertentu. Sebelum vektornya diberi nama, fungsi ini mengembalikan NULL, yaitu penanda bahwa atribut nama memang belum ada:
names(nilai)NULLNama diberikan dengan menugaskan sebuah vektor teks yang panjangnya sama dengan vektor yang dinamai:
names(nilai) <- nama
nilai Ali Budi Citra Dewi Eka
85 90 78 92 88Keluaran kini tersusun dua baris: baris pertama memuat nama elemen dan baris kedua memuat nilainya. Nama bersifat atribut, bukan bagian dari data, sehingga panjang vektor tetap lima dan urutan elemennya tidak berubah. Setelah penugasan ini, nilai tetap vektor angka yang sama, hanya bertambah atribut namanya. Apabila panjang vektor nama tidak sama dengan panjang vektor yang dinamai, R melaporkan error karena setiap elemen harus memperoleh satu nama.
Mengambil elemen dengan kurung siku#
Elemen vektor diambil dengan tanda kurung siku [ beserta indeks angkanya. Pengindeksan di R dimulai dari satu, bukan dari nol, sehingga elemen pertama dipanggil dengan indeks 1. Indeks dapat berupa satu angka, beberapa angka sekaligus, maupun angka negatif.
nilai[1]Ali
85Nama elemen ikut tampil karena vektor ini sudah diberi nama. Beberapa elemen diambil dengan menyediakan vektor indeks, misalnya elemen pertama dan ketiga:
nilai[c(1, 3)] Ali Citra
85 78Indeks negatif melakukan sebaliknya, yaitu membuang elemen pada posisi tersebut dan mengembalikan sisanya:
nilai[-2] Ali Citra Dewi Eka
85 78 92 88Tanda [ selalu mengembalikan vektor, sekecil apa pun hasilnya. Untuk mengeluarkan satu elemen tunggal tanpa pembungkus vektor dan tanpa atribut namanya, R menyediakan tanda [[:
nilai[[1]][1] 85Hasil nilai[[1]] adalah angka 85 polos, sedangkan nilai[1] adalah vektor satu elemen yang membawa nama Ali. Keduanya sama isinya, tetapi bentuknya berbeda, dan perbedaan bentuk ini menjadi penting pada struktur data yang lebih kompleks.
Kesalahan umum#
Dua perilaku pada pengindeksan sering mengejutkan pemula. Yang pertama adalah indeks nol. Pembaca yang terbiasa dengan bahasa berindeks nol kerap mencoba nilai[0], dan R tidak menolaknya melainkan mengembalikan vektor kosong:
nilai[0]named numeric(0)Keluaran named numeric(0) menyatakan vektor numerik berpanjang nol yang membawa atribut nama. Perbaikannya sederhana: indeks dihitung mulai dari satu, sehingga elemen pertama adalah nilai[1].
Perilaku kedua adalah indeks yang melebihi panjang vektor. Apabila elemen keenam diminta padahal vektor hanya memuat lima elemen, R tidak melaporkan error, melainkan mengembalikan NA:
nilai[6]<NA>
NAHasil ini tidak menandakan kegagalan, tetapi mudah luput dari perhatian karena tidak disertai pesan apa pun. Sebelum mengambil elemen ke-n, panjang vektor diperiksa terlebih dahulu dengan length() agar indeksnya tidak keluar batas. Kedua perilaku di atas bukan tanda kerusakan program, melainkan ketelitian yang dituntut dari penulis kodenya.
Ringkasan#
- Fungsi
c()menggabungkan nilai menjadi vektor atomik, dan seluruh elemen vektor atomik bertipe sama. - Angka tunggal pun merupakan vektor berpanjang satu, sehingga setiap keluaran konsol diawali indeks posisi.
names()memberi nama elemen, dan nama tampil sebagai baris label pada keluaran tanpa mengubah isi data.- Pengindeksan dimulai dari satu. Indeks negatif membuang elemen,
[mengembalikan vektor, sedangkan[[mengeluarkan satu elemen tanpa nama.
Referensi#
- An Introduction to R — CRAN — Bagian vectors and assignment menjelaskan pembuatan vektor dengan c() dan penugasannya.
- R Language Definition — CRAN — Bagian basic types menetapkan sifat vektor atomik dan tipe-tipe dasarnya.