Menu

R'de Matrisler: matrix(), cbind, rbind ve Matris Matematiği

matrix(), cbind() ve rbind() ile matris kurma, satır ve sütun indeksleme ve eleman bazlı * işlemini gerçek matris çarpımı %*% işleminden ayrı tutma.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Matris, Boyutları Olan Bir Vektördür

R'de bir matris, her hücresi aynı türü (genellikle sayıları) tutan bir değerler dikdörtgenidir - satırlar ve sütunlar. Perde arkasında tam anlamıyla üzerine bir dim özniteliği iliştirilmiş bir vektördür; davranışının çoğunu bu açıklar: baştan sona tek tür, her yerde vektörleştirilmiş matematik.

Bir matrisi, matrix() ile bir vektörü yeniden şekillendirerek kurarsınız:

Altı değer, iki satır - R üç sütun gerektiğini hesaplar. dim(), iki boyutu birden 2 3 olarak bildirir; nrow() ve ncol() onları ayrı ayrı verir.

Yazdırılan matrise dikkatle bakın: değerler ilk sütun boyunca 1 2, sonra sonraki sütun boyunca 3 4 şeklinde ilerler. R matrisleri varsayılan olarak sütun sütun doldurur. Veriniz satır satır okunuyorsa - ki insanlar genellikle böyle yazar - bunu byrow = TRUE ile söyleyin:

Artık ilk satır 1 2 3. byrow = TRUE unutmak hata vermez - size aynı sayıların transpoze görünümlü bir düzenlemesini sessizce verir; bu yüzden ham değerlerden bir matris kurduğunuzda yazdırılan yerleşimi kontrol etmeyi alışkanlık hâline getirin.

İndeksleme: m[satır, sütun]

Matris indeksleme, tek bir köşeli parantez çiftinin içinde iki konum alır: virgülden önce satır, sonra sütun - ikisi de 1'den sayar:

Bir konumu boş bırakmak "hepsi" demektir: m[1, ] tüm ilk satır, m[, 2] tüm ikinci sütundur. İkisinin de düz vektör olarak geri geldiğine dikkat edin - R, 1 boyutuna çöken boyutu düşürür. Bu, etkileşimli kullanımda kullanışlı, kodda ise bir tuzaktır, çünkü matris bekleyen bir fonksiyon vektörle boğulur. Biçimi korumasını drop = FALSE ile isteyin:

dim() artık 1 3 bildiriyor - hâlâ bir matris. Bir fonksiyonun içinde tek bir satırı ya da sütunu dilimlediğinizde drop = FALSE yazın; önlediği hata (geniş veride çalışıp tek sütunlu veride bozulan kod) izini sürmesi çok can sıkıcı olan türdendir.

Mantıksal maskeler burada da çalışır: m[m > 3], 3'ten büyük tüm hücreleri bir vektör olarak döndürür.

cbind() ve rbind() ile Kurma

Uzun tek bir vektörü yeniden şekillendirmek yerine bir matrisi parçalardan kurabilirsiniz: cbind() vektörleri sütun olarak, rbind() satır olarak birbirine bağlar. Aynı fonksiyonlar mevcut bir matrisi de genişletir:

İsimler vektörlerle birlikte yolculuk eder: cbind(), heights ve weights isimlerini otomatik olarak sütun adı yaptı; bu da yazdırılan matrisi okunabilir tutar. Her iki fonksiyon da uzunlukların uyuşmasını ister (1 uzunluğundaki değerler için geri dönüşümle); 3 uzunluğunda bir vektörü 4 satırlık bir matrise bağlamak sizi uyarır.

Sütun ve satır adları doğrudan colnames(m) <- ... ve rownames(m) <- ... ile de ayarlanabilir; ardından isimle indeksleyebilirsiniz: people[, "weights"].

Eleman Bazlı * ile Gerçek Matris Çarpımı %*%

İşte bu yazının tamamında en çok önem taşıyan ayrım. R'de matrisler için iki çarpma operatörü vardır ve tamamen farklı şeyler hesaplarlar:

  • a * a eleman bazlıdır: her hücre karşılık gelen hücreyle çarpılır. 1 2 3 4 değerleri aynı biçimde dizilmiş hâlde 1 4 9 16 olur. Bu, yalnızca vektörleştirilmiş aritmetiktir - vektörlerde kullandığınız aynı *.
  • a %*% a ise lineer cebirdeki matris çarpımıdır - her sonuç hücresi, ilk matrisin bir satırının ikincinin bir sütunuyla çarpılıp toplanmasıdır. Aynı girdi 7 10 15 22 verir: bambaşka sayılar.

Parçacığı çalıştırın ve iki çıktıyı yan yana karşılaştırın; aynı girdilerde farklılaştıklarını görmek ayrımı akılda kalıcı kılar. Matematiğin %*% gerektirdiği yerde * yazarsanız R sizi uyarmaz - kare matrisler için biçimler her iki durumda da uyumludur - sadece yanlış sayılar alırsınız. İstatistik kodunda (kovaryans matrisleri, doğrusal model cebiri) bu, klasik sessiz hatalardan biridir.

t() transpoze eder - satırları ve sütunları takas eder - ve matris çarpımı iç boyutların eşleşmesini gerektirdiği için sürekli %*% yanında görünür:

Tamlık için: solve(m) bir matrisin tersini alır ve bir vektörle kullanılan %*%, o vektöre tek sütunluk bir matris gibi davranır. Çoğu veri işinin inmesi gereken derinlik bu kadardır.

Satır ve Sütun Özetleri

Satırlar ve sütunlar boyunca toplama ya da ortalama alma o kadar yaygındır ki R bunun için adanmış, hızlı fonksiyonlar sunar:

rowSums() her satırı tek bir sayıya çöktürür (burada 6 15), colSums() her sütunu (5 7 9) ve Means çeşitleri toplamak yerine ortalama alır. Bunları elle yazılmış döngülere, hatta apply(m, 1, sum) çağrısına tercih edin - daha net ve daha hızlıdırlar. Bu dördünün kapsamadığı özetler için (diyelim ki sütun başına maksimum) genel araç apply ailesidir: apply(m, 2, max).

Matris mi, Veri Çerçevesi mi?

İkisi de dikdörtgendir; peki hangisine uzanırsınız?

  • Matris: her hücre aynı türde ve matematik önemliyse. Sayısal hesaplama, lineer cebir, uzaklık hesapları, görüntü benzeri ızgaralar. Matrisler tam da tek tür güvencesi sayesinde daha yalındır ve işlemleri daha hızlıdır.
  • Veri çerçevesi: farklı türlerde sütunlar - isimlerin yanında yaşlar, onların yanında mantıksal bayraklar. Bu, gerçek dünya tablo verisidir ve neredeyse tüm veri analizi fonksiyonlarının beklediği şeydir.

İyi bir kural: isimli, karışık sütunlarla bir hesap tablosunda açacağınız türdense o bir veri çerçevesidir. Üzerinde cebir yapmayı düşündüğünüz bir sayı ızgarasıysa o bir matristir. Aralarında dönüşüm kolaydır (as.matrix(), as.data.frame()) - ama herhangi bir metin sütunu olan bir veri çerçevesinde as.matrix(), her şeyi character'a zorlar; bu yüzden yalnızca sayısal sütunları dönüştürün.

Buradan Ne Çıkarıyorsunuz

  • Matris, boyutları olan bir vektördür: baştan sona tek tür, matrix(data, nrow, ncol) ile kurulur - ve byrow = TRUE geçirmedikçe sütun sütun doldurur.
  • m[satır, sütun] şeklinde indeksleyin; boş bir konum "hepsi" demektir; kod içinde tek satır ya da sütun dilimlerken drop = FALSE ekleyin.
  • cbind() ve rbind(), matrisleri vektörlerden kurar ya da mevcut olanları genişletir.
  • * eleman bazlıdır, %*% gerçek matris çarpımıdır - aynı girdiler, farklı yanıtlar, uyarı yok.
  • rowSums() / colSums() / rowMeans() / colMeans() gündelik özetleri halleder.

Sırada: faktörler - R'nin kategorik veriyi nasıl temsil ettiği ve bununla gelen tuzaklar.

Sıkça Sorulan Sorular

R'de matris nasıl oluşturulur?

matrix(1:6, nrow = 2), bir vektörü sütun sütun doldurarak 2 satır ve 3 sütuna yeniden şekillendirir. Bunun yerine satır satır doldurmak için byrow = TRUE ekleyin. Bir matrisi vektörlerden de kurabilirsiniz: cbind() onları sütun olarak, rbind() satır olarak yapıştırır.

R'de * ile %*% arasındaki fark nedir?

* eleman eleman çarpar - her hücre karşılık gelen hücreyle, biçimler uyuşmalıdır. %*% ise lineer cebirdeki gerçek matris çarpımıdır (satırlar çarpı sütunlar, dolayısıyla iç boyutlar eşleşmelidir). Aynı matrislerde tamamen farklı sonuçlar verirler ve %*% demek isterken * kullanmak klasik bir sessiz hatadır.

R'de bir matrisin tek bir satırı ya da sütunu nasıl alınır?

Diğer konumu boş bırakın: m[1, ] ilk satır, m[, 2] ikinci sütundur. İkisi de varsayılan olarak düz vektör olarak geri gelir. Sonucu tek satırlık ya da tek sütunluk bir matris olarak tutmak için drop = FALSE ekleyin - m[1, , drop = FALSE] gibi - bu, sonraki kod iki boyut beklediğinde önem kazanır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA