Menu

R'de Gruplama ve Özetleme (aggregate, tapply, dplyr)

R'de grup başına istatistik hesaplamanın her yolu: table() ile sayma, grup başına tek istatistik için tapply(), aggregate() formül arayüzü ve dplyr'ın summarize() ile group_by() ikilisi.

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

Grup Başına Satır Sayma: table()

En basit gruplama sorusu "her birinden kaç tane?" sorusudur - ve temel R bunu tek bir çağrıda yanıtlar. table(), her değerin ne sıklıkta göründüğünü sayar:

Tek sütun değer başına sayımları verir; iki sütun eksiksiz bir çapraz tablo verir (bölgeler satır, planlar sütun olarak). "Hangi oranda?" sorusu için onu prop.table(table(...)) içine sarın. table(), R'nin tamamında bir frekans yanıtına giden en hızlı yoldur - tek ihtiyacınız bir sayımsa daha ağır bir şeye uzanmayın.

Grup Başına Tek İstatistik: tapply()

tapply(values, groups, function), ilk vektörü ikinciye göre böler ve fonksiyonu her parçaya uygular:

Sonuç isimli bir vektördür - isim olarak grup etiketleri, değer olarak istatistikler - bu da onu hızlı aramalar için mükemmel kılar (means["EU"]). İsim "table apply" olarak çözülür: bir fonksiyonu bir gruplama tablosu boyunca uygula. sapply() ve lapply() ile aynı aileye aittir; bunlar apply ailesi belgesinde ele alınıyor.

tapply() fonksiyonunun sınırı biçimdir: isimli bir vektörü birleştirmek, çizmek ya da işlemeye devam etmek zahmetlidir. Özet nihai yanıt yerine bir basamak olduğunda geri bir veri çerçevesi istersiniz - bir sonraki aracın döndürdüğü tam da budur.

Formül Beygiri: aggregate()

aggregate(), temel R'nin eksiksiz gruplamasıdır: bir veri çerçevesi döndürür ve formül arayüzü söyleyeceğiniz cümle gibi okunur. value ~ group, "değer, gruba göre ayrıştırılmış" demektir:

Gruplayıcı eklemek, formüle + another_column yazmaktan ibarettir - ikinci çağrı bölge ve çeyrek kombinasyonu başına toplar. cbind(a, b) ~ group ile aynı anda birkaç değer sütununu da toplulaştırabilirsiniz. Çıktı sıradan bir veri çerçevesi olduğu için doğrudan bir birleştirmeye, sıralamaya ya da grafiğe geçer - gruplu özetlerde varsayılan olarak kullanılacak temel araç budur.

Bilinmesi gereken sessiz bir davranış: formül arayüzü, toplulaştırmadan önce kullanılan sütunlarda NA içeren satırları düşürür. Genellikle istediğiniz şeydir; ara sıra da düşük görünen bir sayımın açıklamasıdır.

dplyr Yolu: group_by() + summarize()

Modern standart, dplyr'ın iki fiilli kalıbıdır - group_by() gruplamayı bildirir, summarize() her grubu tek bir satıra çöktürür ve isimlendirdiğiniz kadar istatistik hesaplar (statik; kum havuzu yalnızca temel R çalıştırır):

library(dplyr)

sales |>
    group_by(region) |>
    summarize(
        n     = n(),
        total = sum(amount),
        avg   = mean(amount)
    )

dplyr'ın temel R'yi gerçekten geride bıraktığı yer burasıdır: tek bir okunabilir çağrıda grup başına birden çok istatistik - aggregate() bunun için akrobasi ister - artı bedavaya gelen n() ve doğrudan bir sonraki pipe'a akan bir sonuç. (summarise(), İngiliz yazımıyla aynı fonksiyondur.)

Yeni gelenleri şaşırtan bir şey: birkaç gruplayıcıyla summarize() yalnızca sonuncusunu soyar ve sonucu hâlâ gruplu bırakır - ve bunu bildiren bir mesaj yazdırır. Ne istediğinizi .groups argümanıyla açıkça söyleyin: summarize(avg = mean(amount), .groups = "drop") sade, gruplanmamış bir çerçeve döndürür ve doğru varsayılan alışkanlık budur. Sonraki koda sızan gruplu bir çerçeve, mutate() ve arkadaşlarının sessizce grup başına çalışmasına yol açar - kafa karıştırıcı sonuçların klasik bir kaynağı.

Aralarında Seçim Yapmak

  • Bir sayım - table(), tek çağrıyı hiçbir şey yenemez.
  • Tek istatistik, hızlı bakış - tapply() ve yanıtı isimli vektörden okuyun.
  • Veri çerçevesi çıktısı, yalnızca temel R ortamı - formüllü aggregate().
  • Birkaç istatistik, bir işlem hattının parçası ya da iddialı herhangi bir şey - group_by() |> summarize().

Aralarında yanlış bir yanıt yok - hepsi aynı sayıları hesaplar - ama aracı ihtiyacınız olan çıktı biçimine uydurmak sonrasındaki dönüştürme adımından sizi kurtarır. Ortalamalar, medyanlar ve yayılımların kendisi betimleyici istatistik sayfasında ele alınıyor.

İşlenmiş Örnek: Silindir Sayısına Göre mtcars

Yerleşik bir veri kümesinde her şey bir arada - silindir sayısı başına kaç araba ve ortalama yakıt ekonomisi ile beygir gücü:

Ortalama yaklaşık 26.7 mpg yapan on bir adet 4 silindirli araba, 19.7 civarında yedi adet 6 silindirli, 15.1 civarında on dört adet 8 silindirli - ve beygir gücü ters yönde yürüyor. İki çağrı, bütün bir özet tablosu: gruplu toplulaştırmanın var olma nedeni tam da bu tür bir soruyu yanıtlamaktır.

Buradan Ne Çıkarıyorsunuz

  • Sayımlar için table(), paylar için prop.table().
  • tapply(values, groups, fn) isimli bir vektör döndürür - hızlı bakışlar, kolay aramalar.
  • aggregate(value ~ group, data, FUN) bir veri çerçevesi döndürür; + gruplayıcı, cbind() değer sütunu ekler.
  • dplyr'ın group_by() |> summarize(n = n(), avg = mean(x), .groups = "drop") ifadesi çok istatistikli özetler için modern standarttır.
  • Çıktı biçimine göre seçin; hepsi sayılarda hemfikirdir.

Sırada: bir anahtarı paylaşan tabloları birleştirmek - merge() ve dplyr join ailesi.

Sıkça Sorulan Sorular

R'de grup ortalamasını nasıl hesaplarım?

Temel R'de iki araç var: tapply(df$value, df$group, mean) grup ortalamalarından oluşan isimli bir vektör döndürür ve aggregate(value ~ group, data = df, FUN = mean) aynı sonucu bir veri çerçevesi olarak döndürür. dplyr'da: df |> group_by(group) |> summarize(avg = mean(value)).

R'de gruba göre tekrar sayısını nasıl sayarım?

table(df$group) tek bir çağrıda grup değeri başına satırları sayar; table(df$a, df$b) iki sütunu çapraz tablolar. dplyr'da count(df, group) aynısını yapar ve işlemeye devam etmesi daha kolay olan bir veri çerçevesi döndürür.

R'de aggregate() ne yapar?

aggregate(), bir veri çerçevesini bir ya da daha fazla gruplama sütununa göre böler, her parçaya bir fonksiyon uygular ve sonuçlardan oluşan bir veri çerçevesi döndürür. Formül arayüzü doğal okunur: aggregate(sales ~ region + quarter, data = df, FUN = mean), bölge ve çeyreğe göre gruplanmış satışların ortalaması demektir.

tapply ile aggregate arasındaki fark nedir?

Aynı hesap, farklı çıktı biçimi. tapply() isimli bir vektör (iki gruplayıcıda bir dizi) döndürür - hızlı aramalar için kullanışlıdır. aggregate() bir veri çerçevesi döndürür - sonuç ileri analize, bir birleştirmeye ya da bir grafiğe beslendiğinde daha iyidir. Şüphedeyseniz aggregate().

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA