Menu

R'de Veriyi Yeniden Şekillendirme: pivot_wider ve pivot_longer (Geniş ve Uzun)

Geniş ve uzun veri biçimleri ve aralarında dönüşüm: tidyr'ın pivot_longer() ve pivot_wider() fonksiyonları, eski spread/gather isimleri ve temel R'nin reshape() fonksiyonu.

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

Geniş ve Uzun: Aynı Veri, İki Biçim

Her yeniden şekillendirme sorusu tek bir ayrıma indirgenir; o yüzden onu görelim. İşte küçük bir veri kümesi - iki şehir için çeyreklik satışlar - her iki biçimde de kurulmuş:

Özdeş bilgi, farklı geometri. Geniş biçimde şehir başına bir satır ve çeyrek başına bir sütun vardır - çeyrek, sütun adlarında yaşar. Uzun biçimde ise gözlem başına (şehir × çeyrek) bir satır vardır; çeyrek sıradan bir sütuna indirgenmiş ve her ölçüm tek bir sales sütununa girmiştir.

Hiçbir biçim "doğru" değildir - farklı efendilere hizmet ederler. Geniş, insanların okuduğu ve hesap tablolarının dışa aktardığı biçimdir: derli toplu, bir bakışta karşılaştırılabilir. Uzun, araçların tükettiği biçimdir ve aralarında dönüşüme pivotlama (ya da yeniden şekillendirme - aynı şey) denir.

Analizde Uzun Biçim Neden Kazanır

Geniş biçimin "çeyrek" kavramına ne yaptığına bakın: bir değişkeni sütun adlarına parçaladı. Hiçbir şey bir sütun adıyla hesap yapamaz. Uzun biçimde quarter yeniden veridir ve gruplu analiz takımındaki her şey devreye girer:

  • aggregate(sales ~ quarter, ...) ya da group_by(quarter) - geniş biçimde imkânsızdır; orada her çeyrek elle uğraşacağınız ayrı bir sütundur (gruplu özetlerin tamamı uzun veri varsayar).
  • ggplot2, sütunları estetiklere eşler: aes(x = quarter, y = sales, color = city), o üç sütunun var olmasını ister. Geniş veri çizmek sürekli bir kavgadır; uzun veri çizmek tek satırdır.
  • Q3 eklemek satır eklemektir - şema değişikliği yok - oysa geniş biçim, aşağı akıştaki her adımın öğrenmesi gereken yeni bir sütun büyütür.

Pratik kural: uzun saklayın ve analiz edin, geniş sunun. Aşağıdaki iki dönüşümün bu kadar çok kullanılmasının nedeni budur - veri hesap tablolarından geniş gelir, analiz için uzatılır ve rapordaki son tablo için yeniden genişletilir.

Genişten Uzuna: pivot_longer()

Modern yeniden şekillendirme tidyr paketine (tidyverse'te dplyr'ın kardeşi) aittir. Buradaki parçacıkları statiktir - kum havuzu yalnızca temel R çalıştırır. Uzatmak, her biri bir argüman olan üç karar ister:

library(tidyr)

long <- pivot_longer(wide,
    cols      = c(Q1, Q2),      # which columns to stack
    names_to  = "quarter",      # new column that receives the old NAMES
    values_to = "sales"         # new column that receives the cell VALUES
)

Adım adım: cols, çözülecek sütunları adlandırır (Q1:Q2 aralık söz dizimi ve starts_with("Q") gibi yardımcılar da çalışır - yirmi tane olduğunda kullanışlıdır). Seçilen her hücre bir satır olur; geldiği sütun quarter içine, sayının kendisi sales içine düşer. cols içinde listelenmeyen sütunlar (burada city) tanımlayıcı sayılır ve satırlar boyunca tekrar eder. Sonuç, tam olarak yukarıda yazdırılan long çerçevesidir.

Uzundan Genişe: pivot_wider()

Ters yolculuk iki karar ister - yeni sütun adlarının nereden geleceği ve onları neyin dolduracağı:

wide <- pivot_wider(long,
    names_from  = quarter,   # distinct values here become new columns
    values_from = sales      # these values fill the cells
)

quarter içindeki her farklı değer (Q1, Q2) bir sütun olur; her hücre, o şehir ve çeyrekle eşleşen satırdaki sales değeriyle doldurulur. Kalan sütunlar (city) satır tanımlayıcısı görevi görür - farklı kombinasyon başına bir çıktı satırı. Bir çeyreği eksik olan şehir, o hücrede NA alır (values_fill argümanı başka bir şey koyar, ör. sayım verisi için values_fill = 0).

Eski eğitimlerde bir önceki nesille de karşılaşacaksınız: spread(), pivot_wider() demektir ve gather(), pivot_longer() demektir - tidyr 1.0'dan beri geride bırakıldılar, hâlâ çalışıyorlar, tanımaktan öteye öğrenmeye değmez.

Temel R'de reshape() Var - Dürüst Bir Uyarı

Temel R bunu paketsiz de yapabilir, reshape() ile - o kadar meşhur derecede kafa karıştırıcı bir fonksiyondur ki kendi dokümantasyonu tarihsel olarak bunun için özür dilemiştir. Boylamsal çalışma sözcük dağarcığı (idvar, timevar, direction) etrafında tasarlanmıştır, argüman adları gündelik veriye zahmetle oturur ve herkes onları kullanımlar arasında unutur. Çalışıyor ama:

Çıktı adlarına dikkat: sales.Q1, sales.Q2 - değer sütununun adı her birine kaynaştırılmış. Sıkışıldığında, sıfır bağımlılıklı bir ortamda ya da eski kodda karşılaştığınızda idare eder. Ama veriyi yılda bir kereden fazla yeniden şekillendiriyorsanız dürüst öneri install.packages("tidyr") çağrısıdır - temel R'nin aracının, tasarruf ettiği bağımlılıktan gerçekten daha pahalıya patladığı tek veri düzenleme işi budur.

Genişletirken Yinelenen Anahtar Tuzağı

Genişletme, her tanımlayıcı + isim kombinasyonunun tek bir değeri sabitlediğini varsayar. Lima'nın iki Q1 satırı varsa, tek Q1 hücresine hangi sayı girer? pivot_wider() tahmin etmeyi reddeder: bir uyarı yayar (values are not uniquely identified) ve hücreye bir liste sütunu koyar - içine listeler yuvalanmış bir veri çerçevesi, ki bu onunla yapacağınız bir sonraki şeyi bozar.

O uyarıyı gördüğünüzde önce values_fn kaçış kapağına uzanmayın - yinelenenlerin neden var olduğunu sorun. Genellikle veri sandığınızdan daha ince tanelidir (çeyreklik değil günlük satırlar - o hâlde önce özetleyin, sonra genişletin) ya da yukarı akıştaki bir join satırları çoğaltmıştır. values_fn = mean (ya da sum), ancak yinelenenlerin hangi toplulaştırma altında çökeceğini yüksek sesle söyleyebildiğinizde meşru çözümdür. reshape() burada daha kötüdür: ilk yinelemeyi sessizce tutar ve gerisini düşürür, üstelik yalnızca kolayca kaçırılabilecek bir uyarıyla.

Buradan Ne Çıkarıyorsunuz

  • Geniş: sütun adlarında saklanan değişkenler, okumak için yapılmış. Uzun: gözlem başına bir satır, analiz ve ggplot2 için yapılmış.
  • Uzun saklayın ve analiz edin, geniş sunun.
  • pivot_longer(cols, names_to, values_to) sütunları satırlara yığar; listelenmeyen sütunlar tekrar eden tanımlayıcılar olur.
  • pivot_wider(names_from, values_from) satırları sütunlara yayar; boşluklar NA ile dolar.
  • spread()/gather() eski isimlerdir; temel reshape() çalışır ama meşhur derecede zahmetlidir.
  • Yinelenen tanımlayıcı + isim çiftleri genişletmeyi belirsiz kılar - önce özetleyin, uyarıyı sadece susturmayın.

Sırada: gerçek veriyi dosyalardan okumak - read.csv() ve keskin kenarları.

Sıkça Sorulan Sorular

R'de geniş ve uzun veri arasındaki fark nedir?

Aynı veri, farklı biçimler. Geniş biçim bir değişkeni sütunlara yayar (diyelim ki çeyrek başına bir sütun) - özne başına bir satır, insanın okuması için yapılmış. Uzun biçim ise onu satırlara yığar - gözlem başına bir satır, bir isim sütunu ve bir değer sütunuyla - gruplu analiz ve ggplot2 için yapılmış.

R'de geniş veriyi uzuna nasıl dönüştürürüm?

tidyr'ın pivot_longer(df, cols = Q1:Q4, names_to = "quarter", values_to = "sales") fonksiyonu seçilen sütunları iki yeni sütuna yığar: eski sütun adları names_to sütununa, hücre değerleri values_to sütununa gider.

R'de uzun veriyi genişe nasıl dönüştürürüm?

tidyr'ın pivot_wider(df, names_from = quarter, values_from = sales) fonksiyonu satırları sütunlara yayar: names_from içindeki her farklı değer bir sütun olur ve eşleşen values_from girdileriyle doldurulur. Eksik kombinasyonlar NA olur.

R'de spread ve gather'ın yerini ne aldı?

tidyr 1.0'da (2019) pivot_wider(), spread() yerine ve pivot_longer(), gather() yerine geçti. Eski fonksiyonlar hâlâ çalışıyor - onları eski eğitimlerde göreceksiniz - ama tüm yeni kod, daha net argümanları ve daha fazla özelliği olan pivot_* ikilisini kullanmalı.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA