Menu

Vector di R: c(), seq(), Pengindeksan, dan Matematika Tervektorisasi

Vector adalah unit dasar R; bahkan satu angka pun adalah vector. Cara membuatnya dengan c(), mengindeksnya (mulai dari 1!), memfilternya dengan mask logika, dan menghitung seluruh vector sekaligus.

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

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:10 adalah yang dipakai sehari-hari: integer dari satu batas ke batas lain, dengan langkah 1.
  • seq() memperluasnya: pilih langkahnya dengan by =, atau sebutkan berapa elemen yang kamu inginkan dengan length.out = dan biarkan R menghitung jaraknya.
  • seq_len(n) menghasilkan 1 sampai n dan merupakan cara aman membuat indeks perulangan: tidak seperti 1:n, fungsi ini dengan benar menghasilkan vector kosong ketika n bernilai 0, alih-alih menghitung mundur 1 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 -1 berarti elemen terakhir. Kamu tidak bisa mencampur indeks positif dan negatif dalam satu panggilan.
  • fruits[0] bukan error: ia mengembalikan character(0) yang kosong. Bug selisih satu di R sering menghasilkan hasil kosong tanpa suara alih-alih crash, jadi ada baiknya memeriksa length() 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(), dan rep(), dan ingat bahwa c() 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai