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 * aeleman bazlıdır: her hücre karşılık gelen hücreyle çarpılır.1 2 3 4değerleri aynı biçimde dizilmiş hâlde1 4 9 16olur. Bu, yalnızca vektörleştirilmiş aritmetiktir - vektörlerde kullandığınız aynı*.a %*% aise 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ı girdi7 10 15 22verir: 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 - vebyrow = TRUEgeç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 dilimlerkendrop = FALSEekleyin.cbind()verbind(), 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.