Menu

R'de Sıralama: sort(), order() ve arrange()

R'de sıralama gerçekte nasıl çalışır: vektörler için sort(), veri çerçevelerinin neden order() indeks hilesine ihtiyaç duyduğu, azalan ve çok sütunlu sıralamalar ve dplyr'ın arrange() fonksiyonu.

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

sort() Bir Vektörün Değerlerini Sıralar

Düz bir vektör için sort() tam da beklediğiniz şeyi yapar - değerleri artan sırada döndürür (orijinale dokunulmaz):

Bilmeye değer iki seçenek. decreasing = TRUE yönü ters çevirir. Ve sort() varsayılan olarak NA değerlerini sessizce atar - sort(c(3, NA, 1)) yalnızca 1 3 döndürür. Eksik değerlerin sıralamadan sağ çıkması gerekiyorsa nereye gideceklerini söyleyin: sort(x, na.last = TRUE) onları korur ve sıralanmış değerlerin arkasına yerleştirir.

Buraya kadar her şey bariz. İlginç kısım, sort() fonksiyonunun veri çerçeveleri için neden yanlış araç olduğudur.

order() Konumları Döndürür - Zihinsel Kayma

sort() "değerler sıralı hâlde nedir?" sorusunu yanıtlar. order() farklı bir soruyu yanıtlar: "değerleri sıralı görmek için hangi konumları ziyaret etmeliyim?"

order(times) çıktısını talimat olarak okuyun: en küçük değer 2. konumda, sonraki 4. konumda, sonra 1, sonra 3. Bu talimatlarla indekslemek - times[order(times)] - sort(times) sonucunu birebir üretir.

Bu neden önemli? Çünkü bir veri çerçevesi satırı, birlikte hareket etmesi gereken bir değerler takımıdır. Yalnızca time sütununu sort() ile sıralamak bir sütunu yeniden düzenler ve takım arkadaşlarını geride bırakır - her satır karışır. order() bunun yerine size satır konumları verir ve konumları köşeli parantezlerin satır yuvasına koymak tüm satırları taşır:

Ben'in 9.8 değeri, Ben'in adı hâlâ ilişikteyken geliyor. Hilenin tamamı budur ve temel R'de veri çerçevelerini sıralamanın asıl deyimidir: df[order(df$column), ]. (Yazdırılan satır etiketleri - 2 4 1 3 - peşinden gelen orijinal satır numaralarıdır; zararsız.)

Azalan ve Çok Sütunlu Sıralamalar

Azalan sayısal sıralamalar için sütunu negatifleyin - -time değerini artan sıralamak, time değerini azalan sıralamaktır. Ve order() birden çok sütun alır; öncekiler önce gelir, sonrakiler eşitlikleri bozar:

İkinci çağrı departmanları alfabetik olarak sıralar ve her departmanın içinde maaşları yüksekten düşüğe dizer. Negatifleme hilesi yalnızca sayılarda çalışır - bir character sütununda -df$name bir hatadır. Azalan metin için bunun yerine order(df$name, decreasing = TRUE) kullanın (bu, tüm sıralama anahtarlarını aynı anda ters çevirir).

rank() Üçüncü Kardeştir

Geçerken: rank(x) başka bir soruyu yanıtlar - "her değer hangi sırayı tutuyor?" - ve hiçbir şeyi yerinden oynatmaz:

sort() sıralı değerleri, order() ziyaret edilecek konumları, rank() ise her değerin yerinde duran derecesini verir. İnsanlar order() ile rank() fonksiyonlarını sürekli karıştırır; birbirlerinin ters permütasyonu olduklarına dikkat edin ve rank() fonksiyonuna yalnızca gerçekten derecelendirme istediğinizde (lider tabloları, yüzdelikler) uzanın.

dplyr Yolu: arrange()

dplyr'ın arrange() fonksiyonu tüm order() dansını bir fiile sarar - sütunlar sıralama anahtarlarıdır, desc() birini ters çevirir (statik; kum havuzu yalnızca temel R çalıştırır):

library(dplyr)

runners |> arrange(time)
staff   |> arrange(dept, desc(salary))

Köşeli parantez yok, $ yok, negatifleme hilesi yok - desc() character sütunlarda da çalışır. Bilmeye değer bir davranış farkı: arrange(), yönden bağımsız olarak NA değerlerini sona koyar; temel order() de na.last = TRUE varsayılanını kullanır. arrange() fonksiyonunun filter() ve arkadaşlarıyla nasıl zincirlendiği için bkz. dplyr girişi.

Metin Sıralamasının Keskin Kenarları Var

Metin sıralarken iki uyarı. Birincisi, metin olarak saklanan rakamlar metin gibi sıralanır - character karşılaştırması sembol sembol ilerler:

"10", "2" değerinden önce sıralanır, çünkü karşılaştırma ilk sembolde durur: "1" < "2". Bir sayı sütunu tuhaf sıralanıyorsa neredeyse kesinlikle character olarak saklanmıştır - önce as.numeric() ile dönüştürün (dağınık bir CSV içe aktarımının sık görülen sonrası).

İkincisi, metin sıralaması sisteminizin yereline bağlıdır - aksanlar, büyük/küçük harf ve Latin olmayan yazılar dizüstünüzde, C yereline sahip bir sunucudakinden farklı sıralanabilir. Makineler arasında birebir aynı olması gereken sıralı çıktı ya yereli açıkça ayarlamalı ya da normalleştirilmiş bir anahtarı sıralamalıdır.

Buradan Ne Çıkarıyorsunuz

  • sort(x) bir vektörün değerlerini sıralar; decreasing = TRUE ters çevirir; na.last = TRUE verilmedikçe NA'lar atılır.
  • order(x) konumları döndürür ve df[order(df$x), ], veri çerçevelerini sıralamanın asıl temel deyimidir.
  • Çok sütunlu: order(df$a, -df$b); azalan için negatifleme yalnızca sayılarda çalışır.
  • rank() yeniden düzenlemeden dereceleri verir - order() yerine geçmez.
  • dplyr'ın arrange(dept, desc(salary)) ifadesi aynı sıralamayı daha az noktalamayla yapar.
  • Metinde "10", "2" değerinden önce sıralanır - sütun türlerinizi kontrol edin.

Sırada: table(), tapply(), aggregate() ve dplyr'ın group_by() fonksiyonuyla satırları grup özetlerine çöktürmek.

Sıkça Sorulan Sorular

R'de bir veri çerçevesini bir sütuna göre nasıl sıralarım?

Satır köşeli parantezlerinin içinde order() kullanın: df[order(df$price), ]. order(), satır konumlarını sıralı hâlde döndürür ve onlarla indekslemek tüm veri çerçevesini yeniden düzenler. sort() burada işe yaramaz - tek bir vektörün değerlerini sıralar ve diğer sütunlarla bağlarını koparır.

R'de sort() ile order() arasındaki fark nedir?

sort(x), x değerlerini sıralanmış hâlde döndürür. order(x) ise x'i sıraya sokacak konumları (indeksleri) döndürür - bir veri çerçevesinin tamamını sütunlarından birine göre sıralamak için ihtiyacınız olan şey budur: df[order(df$x), ].

R'de azalan sırada nasıl sıralarım?

Bir vektör için: sort(x, decreasing = TRUE). Bir veri çerçevesi için: df[order(-df$x), ] (sayısal bir sütunu negatifleyin) ya da negatiflemenin işe yaramadığı character sütunlarda da çalışan df[order(df$x, decreasing = TRUE), ]. dplyr'da: arrange(df, desc(x)).

R'de birden çok sütuna göre nasıl sıralarım?

Hepsini order() fonksiyonuna geçirin: df[order(df$dept, -df$salary), ], önce departmana, sonra her departman içinde maaşa göre azalan sıralar. Önceki argümanlar birincil anahtarlardır; sonrakiler eşitlikleri bozar. dplyr'da: arrange(df, dept, desc(salary)).

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA