Semua di R Adalah Vector
Sebagian besar bahasa punya skalar, yaitu nilai tunggal, lalu semacam tipe wadah untuk menampung beberapa nilai. R melewatkan skalar. Vector adalah kumpulan nilai berurutan yang semuanya bertipe sama, dan menjadi unit dasar bagi semua hal lain. Bahkan yang terlihat seperti satu angka saja adalah vector dengan panjang 1:
c(), singkatan dari combine, adalah cara membuat vector secara manual. length() memberi tahu berapa banyak elemen di dalamnya. Dan 5 saja melaporkan is.vector sebagai TRUE dengan panjang 1: R tidak pernah berhenti bekerja dengan vector, hanya kadang bekerja dengan vector yang sangat pendek.
Desain inilah alasan kode R terlihat berbeda dari Python atau JavaScript: operasi yang di tempat lain kamu tulis dengan perulangan berlaku untuk seluruh vector dalam satu ekspresi. Kita akan sampai ke sana di bawah.
Satu aturan yang perlu dipahami sekarang: semua elemen sebuah vector bertipe sama. Kalau kamu memberi c() campuran, ia tidak protes, tetapi diam-diam mengonversi semuanya ke tipe paling fleksibel yang ada:
Satu string di dalam campuran mengubah semuanya menjadi string ("1", "TRUE"). Nilai logika di antara angka menjadi 1 dan 0. Koersi ini mengikuti urutan yang tetap, logical → integer → double → character, dan terjadi tanpa peringatan, itulah sebabnya satu "7" yang nyasar di kolom angka bisa diam-diam mengubah seluruh dataset-mu menjadi teks. Hierarki lengkapnya dibahas di tipe data; kalau kamu perlu menampung nilai yang memang bercampur, itulah gunanya list.
Membuat Barisan: :, seq(), dan rep()
Mengetik setiap elemen ke dalam c() cepat membosankan. R punya tiga jalan pintas untuk pola yang teratur:
1:10adalah yang dipakai sehari-hari: integer dari satu batas ke batas lain, dengan langkah 1.seq()memperluasnya: pilih langkahnya denganby =, atau sebutkan berapa elemen yang kamu inginkan denganlength.out =dan biarkan R menghitung jaraknya.seq_len(n)menghasilkan1sampaindan merupakan cara aman membuat indeks perulangan: tidak seperti1:n, fungsi ini dengan benar menghasilkan vector kosong ketikanbernilai 0, alih-alih menghitung mundur1 0.rep()mengulang:times =mengulang seluruh vector dari ujung ke ujung (1 2 1 2 1 2),each =mengulang setiap elemen di tempatnya (1 1 1 2 2 2). Keduanya mudah tertukar; jalankan potongan kodenya dan bandingkan.
Pengindeksan: R Menghitung dari 1
Kurung siku mengambil elemen. Elemen pertama adalah [1], bukan [0]. Kalau kamu datang dari Python atau JavaScript, inilah sandungan awal yang paling umum:
Tiga hal di sini layak diperhatikan:
- Kamu bisa mengindeks dengan sebuah vector posisi:
fruits[c(2, 4)]mengambil elemen kedua dan keempat sekaligus. - Indeks negatif berarti "semuanya kecuali".
fruits[-1]adalah vector tanpa elemen pertamanya. Ini sangat berbeda dari Python, tempat-1berarti elemen terakhir. Kamu tidak bisa mencampur indeks positif dan negatif dalam satu panggilan. fruits[0]bukan error: ia mengembalikancharacter(0)yang kosong. Bug selisih satu di R sering menghasilkan hasil kosong tanpa suara alih-alih crash, jadi ada baiknya memeriksalength()ketika sesuatu di langkah berikutnya tampak kosong secara misterius.
Elemen juga bisa punya nama, yang memberimu cara ketiga untuk mengindeks, yaitu berdasarkan label:
Named vector bekerja seperti tabel pencarian sederhana dan menjaga kode tetap mudah dibaca: prices["tea"] menyatakan maksudnya, prices[2] tidak.
Mask Logika dan which()
Cara mengindeks yang paling kuat adalah dengan vector logika, yaitu mask berisi nilai TRUE/FALSE yang panjangnya sama dengan datanya. Setiap perbandingan pada vector menghasilkan persis itu:
temps > 24 tidak memberi satu jawaban, tetapi lima, satu per elemen. Menaruh mask itu di dalam [ ] menyisakan elemen-elemen yang mask-nya TRUE. Gabungkan kondisi dengan & (dan) dan | (atau), yang dibahas bersama operator lainnya.
which() menerjemahkan mask menjadi posisi: di sini 2 3 5, indeks dari suhu yang panas. Pakai saat kamu perlu tahu di mana kecocokannya berada, untuk melaporkannya, atau untuk mengindeks vector lain di posisi yang sama. Untuk sekadar memfilter, temps[temps > 24] lebih langsung daripada temps[which(temps > 24)].
Pola memfilter dengan mask ini adalah tulang punggung hampir semua pekerjaan data di R; pola ini muncul lagi saat kamu memfilter baris sebuah data frame.
Matematika Tervektorisasi dan Aturan Recycling
Aritmetika di R berlaku elemen demi elemen di seluruh vector, tanpa perlu perulangan:
Baris pertama adalah fitur utamanya: prices * 2 menggandakan setiap elemen. Ketika bahasa lain butuh for loop, R cukup butuh sebuah operator, dan bentuk tervektorisasi ini lebih pendek sekaligus lebih cepat, karena perulangannya terjadi di kode C yang sudah dioptimalkan di baliknya. Tulis for loop ketika setiap langkah bergantung pada langkah sebelumnya; untuk matematika per elemen, pakai vektorisasi.
Baris ketiga menunjukkan aturan recycling: ketika vector-vectornya punya panjang berbeda, R mengulang yang lebih pendek agar cocok. c(10, 20) diulang menjadi 10 20 10 20, menghasilkan 11 22 13 24. Mengulang 2 di sepanjang vector dengan panjang 3 itulah yang membuat prices * 2 berhasil: skalar hanyalah vector dengan panjang 1 yang sedang di-recycle.
Recycling berjalan rapi ketika panjang yang lebih besar adalah kelipatan pasti dari yang lebih kecil. Ketika tidak, R tetap menghitung jawabannya, dan mengeluarkan peringatan:
Kamu mendapat 11 22 13 ditambah peringatan bahwa panjang objek yang lebih panjang bukan kelipatan dari panjang objek yang lebih pendek. Anggap peringatan itu sebagai laporan bug: recycling sebagian hampir tidak pernah sesuai maksudmu, dan biasanya berarti dua vector yang seharusnya sama panjang ternyata tidak.
Mengurutkan, Membalik, Menghapus Duplikat
Tiga utilitas kecil yang akan terus kamu pakai:
sort() mengurutkan nilainya, rev() membalik urutan yang ada tanpa mengurutkan, dan unique() membuang duplikat sambil mempertahankan kemunculan pertamanya. Tidak satu pun dari ketiganya mengubah x: seperti hampir semua hal di R, mereka mengembalikan vector baru dan membiarkan yang asli apa adanya.
Yang Perlu Kamu Ingat
- Vector adalah unit dasar R: berurutan, satu tipe di seluruhnya, dan bahkan nilai tunggal adalah vector dengan panjang 1.
- Buat dengan
c(), bentuk pola dengan:,seq(), danrep(), dan ingat bahwac()diam-diam melakukan koersi pada tipe yang bercampur. - Pengindeksan dimulai dari 1; indeks negatif membuang elemen; nama memungkinkanmu mengindeks berdasarkan label.
- Mask logika (
x[x > 5]) adalah idiom memfilter di seluruh bahasa ini;which()mengubah mask menjadi posisi. - Matematika itu tervektorisasi, vector yang lebih pendek di-recycle, dan peringatan recycling sebagian berarti ada bug.
Berikutnya: list, wadah untuk ketika nilai-nilaimu tidak bertipe sama.
Pertanyaan yang sering diajukan
Bagaimana cara membuat vector di R?
Dengan fungsi c() (singkatan dari combine): x <- c(10, 20, 30). Untuk barisan yang teratur, pakai 1:10, seq(0, 1, by = 0.25), atau rep(0, 5). Setiap elemen pada akhirnya harus bertipe sama; kalau kamu mencampur tipe, R diam-diam mengonversi semuanya ke tipe yang paling fleksibel.
Apakah indeks di R dimulai dari 0 atau 1?
Dari 1. x[1] adalah elemen pertama, x[length(x)] adalah elemen terakhir. Ini menjebak semua orang yang datang dari Python, JavaScript, atau C: tidak ada elemen x[0] (memintanya mengembalikan vector kosong, bukan error, sehingga bug-nya tidak terlihat).
Apa yang dilakukan aturan recycling di R?
Saat kamu melakukan aritmetika pada dua vector dengan panjang berbeda, R mengulang vector yang lebih pendek sampai panjangnya sama dengan yang lebih panjang. c(1, 2, 3, 4) + c(10, 20) menghasilkan 11 22 13 24. Kalau panjang yang lebih besar bukan kelipatan dari yang lebih kecil, R tetap menghitung jawabannya tetapi mengeluarkan peringatan; anggap peringatan itu sebagai bug.
Apa fungsi which() di R?
Fungsi ini mengubah vector logika menjadi posisi dari nilai-nilai TRUE-nya. Kalau x > 5 menghasilkan FALSE TRUE TRUE, maka which(x > 5) menghasilkan 2 3. Pakai saat kamu butuh posisinya; untuk sekadar memfilter, mengindeks langsung dengan vector logika (x[x > 5]) lebih sederhana.