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 programlama dilleri çizimi

Coddy ile kodlamayı öğren

Başla