Matriks

Matriks dua dimensi beserta operasi per baris dan per kolomnya.

Daftar isi

Vektor di R berdimensi satu, sehingga data tabular sederhana seperti nilai beberapa siswa pada beberapa mata pelajaran tidak dapat langsung disimpan di dalamnya. Matriks melengkapi kekurangan tersebut dengan menyusun data dalam dua dimensi, yaitu baris dan kolom, dengan syarat seluruh isinya bertipe sama. Topik ini membahas pembuatan matriks, pengambilan baris dan kolom, operasi ringkas per baris dan per kolom, serta pengenalan t() dan perkalian matriks.

Membuat matriks dengan matrix()#

Fungsi matrix() membentuk matriks dari satu vektor data beserta ukuran yang diinginkan. Secara bawaan, isian vektor mengalir menuruni kolom terlebih dahulu, yaitu kolom pertama terisi penuh sebelum kolom kedua dimulai. Contoh berikut menyusun nilai tiga siswa untuk dua mata pelajaran, lengkap dengan nama baris dan nama kolom.

r Contoh: membuat matriks dengan nama baris dan kolom
nilai <- matrix(c(80, 85, 78, 90, 70, 88), nrow = 3, ncol = 2)
rownames(nilai) <- c("Ali", "Budi", "Citra")
colnames(nilai) <- c("Matematika", "IPA")
nilai
text Keluaran
      Matematika IPA
Ali           80  90
Budi          85  70
Citra         78  88

Argumen byrow = TRUE mengubah arah pengisian menjadi menyamping mengikuti baris. Perbandingan berikut memperlihatkan susunan angka 1 sampai 6 pada kedua arah pengisian.

r Contoh: pengisian menurut kolom dan menurut baris
matrix(1:6, nrow = 2, ncol = 3)
matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
text Keluaran
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

Ukuran matriks dibaca dengan dim(), sedangkan nrow() dan ncol() membaca jumlah baris dan jumlah kolomnya secara terpisah.

r Contoh: membaca ukuran matriks
dim(nilai)
nrow(nilai)
ncol(nilai)
text Keluaran
[1] 3 2
[1] 3
[1] 2

Mengambil baris dan kolom#

Pengindeksan matriks menggunakan dua indeks, yaitu [baris, kolom]. Kedua indeks dapat berupa angka maupun nama, dan salah satu indeksnya boleh dikosongkan untuk mengambil seluruh baris atau seluruh kolom.

r Contoh: mengambil elemen, kolom, dan baris
nilai["Ali", "IPA"]
nilai[1, 2]
nilai[, 1]
nilai[2, ]
text Keluaran
[1] 90
[1] 90
  Ali  Budi Citra
   80    85    78
Matematika        IPA
        85         70

Hasil pengambilan satu elemen berupa vektor sepanjang satu. Hasil pengambilan satu baris atau satu kolom juga berupa vektor, lengkap dengan nama-namanya. Perhatikan urutan indeksnya, yaitu baris lebih dahulu, sehingga nilai[1, 2] berarti elemen baris pertama kolom kedua dan bukan sebaliknya.

Ringkasan per baris dan per kolom#

Empat fungsi meringkas matriks tanpa perulangan eksplisit, yaitu rowSums(), colSums(), rowMeans(), dan colMeans(). Keluarannya berupa vektor bernama, satu nilai untuk setiap baris atau setiap kolom.

r Contoh: jumlah per baris dan per kolom
rowSums(nilai)
colSums(nilai)
text Keluaran
  Ali  Budi Citra
  170   155   166
Matematika        IPA
       243        248
r Contoh: rata-rata per baris dan per kolom
rowMeans(nilai)
colMeans(nilai)
text Keluaran
  Ali  Budi Citra
 85.0  77.5  83.0
Matematika        IPA
  81.00000   82.66667

Fungsi yang lebih umum daripada keempat fungsi khusus di atas adalah apply() dengan argumen margin. Margin 1 berarti fungsi diterapkan pada setiap baris, dan margin 2 berarti pada setiap kolom. Contoh berikut menghitung nilai tertinggi pada setiap baris dan setiap kolom.

r Contoh: apply untuk fungsi apa pun
apply(nilai, 1, max)
apply(nilai, 2, max)
text Keluaran
  Ali  Budi Citra
   90    85    88
Matematika        IPA
        85         90

Untuk jumlah dan rata-rata, fungsi khusus seperti colSums() lebih cepat daripada apply(), tetapi apply() melayani fungsi apa pun, misalnya max pada contoh di atas.

Transposisi dan perkalian matriks#

Fungsi t() menukar baris menjadi kolom, yang berguna saat orientasi data perlu dibalik.

r Contoh: transpos matriks
t(nilai)
text Keluaran
           Ali Budi Citra
Matematika  80   85    78
IPA         90   70    88

Perkalian matriks ditulis dengan operator %*%, berbeda dari perkalian elemen demi elemen yang memakai tanda *. Contoh berikut mengalikan matriks nilai dengan vektor bobot untuk menghitung nilai akhir berbobot tiap siswa, dengan bobot Matematika lebih besar daripada IPA.

r Contoh: perkalian matriks dengan vektor bobot
bobot <- c(0.6, 0.4)
nilai %*% bobot
text Keluaran
      [,1]
Ali     84
Budi    79
Citra   82

Hasilnya berupa matriks satu kolom. Pada perkalian matriks, jumlah kolom matriks kiri harus sama dengan jumlah baris matriks kanan, dan hasilnya selalu berukuran jumlah baris matriks kiri kali jumlah kolom matriks kanan. Bagian ini cukup sebagai perkenalan, dan penerapan penuhnya baru ditemui pada materi pemodelan.

Kesalahan umum#

Kesalahan pertama adalah mencampur tipe data. Matriks menuntut seluruh isinya bertipe sama, dan apabila satu angka dicampur teks, seluruh matriks dipaksa menjadi teks tanpa pesan error apa pun.

r Contoh: pencampuran tipe memaksa seluruh matriks menjadi teks
matrix(c("Ali", 80, "Budi", 85), nrow = 2)
text Keluaran
     [,1]  [,2]
[1,] "Ali" "Budi"
[2,] "80"  "85"

Seluruh isinya kini bertanda kutip, yaitu character, sehingga perhitungan matematis tidak lagi dapat dilakukan. Kondisi semacam ini tidak memunculkan pesan apa pun, sehingga tipe isinya perlu dijaga sejak pembuatan.

Kesalahan kedua adalah tertukarnya urutan indeks. Bentuk [baris, kolom] mudah tertukar dengan kebiasaan kolom lebih dahulu pada beberapa alat lain, dan pertukaran seperti ini tidak memunculkan error karena kedua indeksnya tetap sah. Apabila hasil pengindeksan terlihat tidak sesuai dugaan, periksa urutan indeksnya terlebih dahulu.

Ringkasan#

  • matrix() menyusun vektor menjadi dua dimensi dengan pengisian menurut kolom secara bawaan, dan byrow = TRUE mengubahnya menjadi menurut baris.
  • Pengindeksan memakai [baris, kolom], dan indeks yang dikosongkan berarti seluruh baris atau seluruh kolom.
  • rowSums(), colSums(), rowMeans(), dan colMeans() meringkas matriks per baris dan per kolom, sedangkan apply() melayani fungsi apa pun melalui argumen margin.
  • t() menukar baris dengan kolom, dan %*% melakukan perkalian matriks yang berbeda dari perkalian elemen demi elemen.
  • Pencampuran tipe memaksa seluruh matriks menjadi teks tanpa pesan error.

Referensi#