Menu

Mengurutkan Data di R: sort(), order(), dan arrange()

Cara kerja pengurutan di R yang sebenarnya: sort() untuk vector, kenapa data frame butuh trik indeks dari order(), pengurutan menurun dan multikolom, serta arrange() dari dplyr.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

sort() Mengurutkan Nilai Sebuah Vector

Untuk vector biasa, sort() bekerja persis seperti dugaanmu: mengembalikan nilai-nilainya dalam urutan naik (vector aslinya tidak berubah):

Ada dua opsi yang perlu diketahui. decreasing = TRUE membalik arahnya. Dan secara default sort() diam-diam membuang nilai NA: sort(c(3, NA, 1)) hanya mengembalikan 1 3. Kalau nilai yang hilang harus tetap ada setelah diurutkan, tentukan letaknya: sort(x, na.last = TRUE) mempertahankannya, ditaruh sesudah nilai-nilai yang sudah berurutan.

Sejauh ini, semuanya jelas. Bagian yang menarik adalah kenapa sort() merupakan alat yang salah untuk data frame.

order() Mengembalikan Posisi: Perubahan Cara Berpikir

sort() menjawab "apa saja nilainya, secara berurutan?" order() menjawab pertanyaan lain: "posisi mana saja yang harus kukunjungi untuk melihat nilai-nilainya secara berurutan?"

Baca order(times) sebagai instruksi: nilai terkecil ada di posisi 2, berikutnya di posisi 4, lalu 1, lalu 3. Mengindeks dengan instruksi itu, times[order(times)], menghasilkan sort(times) dengan persis.

Kenapa itu penting? Karena satu baris data frame adalah sebuah tim nilai yang harus bergerak bersama. Mengurutkan kolom time saja dengan sort() akan menyusun ulang satu kolom dan meninggalkan rekan-rekannya, sehingga setiap baris kacau. order() memberimu posisi baris, dan menaruh posisi di slot baris dalam kurung siku memindahkan seluruh baris:

9.8 milik Ben datang dengan nama Ben yang masih menempel. Itulah seluruh triknya, dan inilah idiom utama untuk mengurutkan data frame di R dasar: df[order(df$column), ]. (Label baris yang tercetak, 2 4 1 3, adalah nomor baris asli yang ikut terbawa; tidak masalah.)

Pengurutan Menurun dan Multikolom

Untuk pengurutan numerik menurun, negasikan kolomnya: mengurutkan -time secara naik sama dengan mengurutkan time secara menurun. Dan order() menerima beberapa kolom, yang lebih awal didahulukan, yang sesudahnya memutuskan nilai yang sama:

Panggilan kedua mengurutkan departemen secara alfabetis dan, di dalam setiap departemen, gaji dari tinggi ke rendah. Trik negasi hanya berlaku untuk angka: -df$name pada kolom character menghasilkan error. Untuk teks secara menurun, pakai order(df$name, decreasing = TRUE) (yang membalik semua kunci pengurutan sekaligus).

rank() Adalah Saudara Ketiga

Sekilas saja: rank(x) menjawab pertanyaan lain lagi, "di peringkat berapa setiap nilai berada?", tanpa memindahkan apa pun:

sort() memberi nilai yang berurutan, order() memberi posisi yang perlu dikunjungi, rank() memberi peringkat setiap nilai di tempatnya. Orang terus-menerus mencampuradukkan order() dan rank(); perhatikan bahwa keduanya permutasi yang saling berkebalikan, dan pakai rank() hanya ketika kamu memang butuh peringkat (papan peringkat, persentil).

Cara dplyr: arrange()

arrange() dari dplyr membungkus seluruh langkah order() itu dalam satu kata kerja: kolom adalah kunci pengurutan, desc() membalik salah satunya (statis; sandbox hanya menjalankan R dasar):

library(dplyr)

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

Tanpa kurung siku, tanpa $, tanpa trik negasi; desc() juga bekerja pada kolom character. Satu perbedaan perilaku yang perlu diketahui: arrange() menaruh nilai NA di akhir apa pun arahnya, sedangkan order() dasar juga default-nya na.last = TRUE. Lihat pengantar dplyr untuk melihat cara arrange() dirangkai dengan filter() dan kawan-kawannya.

Pengurutan Character Punya Sisi Tajam

Dua catatan saat mengurutkan teks. Pertama, angka yang disimpan sebagai teks diurutkan sebagai teks: perbandingan character berjalan simbol demi simbol:

"10" diurutkan sebelum "2" karena perbandingannya berhenti di simbol pertama: "1" < "2". Kalau kolom berisi angka diurutkan dengan aneh, hampir pasti kolom itu disimpan sebagai character; konversikan dulu dengan as.numeric() (akibat yang sering muncul setelah impor CSV yang berantakan).

Kedua, urutan teks bergantung pada locale sistemmu: aksen, huruf besar dan kecil, dan aksara non-Latin bisa diurutkan berbeda di laptopmu dibandingkan di server dengan locale C. Output terurut yang harus identik di berbagai komputer sebaiknya mengatur locale secara eksplisit atau mengurutkan kunci yang sudah dinormalkan.

Yang Perlu Kamu Ingat

  • sort(x) mengurutkan nilai sebuah vector; decreasing = TRUE membaliknya; NA dibuang kecuali na.last = TRUE.
  • order(x) mengembalikan posisi, dan df[order(df$x), ] adalah idiom utama R dasar untuk mengurutkan data frame.
  • Multikolom: order(df$a, -df$b); negasi untuk urutan menurun hanya berlaku pada angka.
  • rank() memberi peringkat tanpa menyusun ulang, dan bukan pengganti order().
  • arrange(dept, desc(salary)) dari dplyr adalah pengurutan yang sama dengan tanda baca yang lebih sedikit.
  • "10" diurutkan sebelum "2" dalam teks, jadi periksa tipe kolommu.

Berikutnya: meringkas baris menjadi ringkasan per kelompok dengan table(), tapply(), aggregate(), dan group_by() dari dplyr.

Pertanyaan yang sering diajukan

Bagaimana cara mengurutkan data frame berdasarkan kolom di R?

Pakai order() di dalam kurung baris: df[order(df$price), ]. order() mengembalikan posisi baris dalam urutan yang benar, dan mengindeks dengannya menyusun ulang seluruh data frame. sort() tidak bisa dipakai di sini, karena ia mengurutkan nilai satu vector saja dan memutus hubungannya dengan kolom lain.

Apa bedanya sort() dan order() di R?

sort(x) mengembalikan nilai x yang sudah disusun berurutan. order(x) mengembalikan posisi (indeks) yang akan membuat x berurutan, dan itulah yang kamu butuhkan untuk mengurutkan seluruh data frame berdasarkan salah satu kolomnya: df[order(df$x), ].

Bagaimana cara mengurutkan secara menurun di R?

Untuk vector: sort(x, decreasing = TRUE). Untuk data frame: df[order(-df$x), ] (negasikan kolom numerik) atau df[order(df$x, decreasing = TRUE), ], yang juga berlaku untuk kolom character yang tidak bisa dinegasikan. Di dplyr: arrange(df, desc(x)).

Bagaimana cara mengurutkan berdasarkan beberapa kolom di R?

Berikan semuanya ke order(): df[order(df$dept, -df$salary), ] mengurutkan berdasarkan departemen, lalu berdasarkan gaji di dalam setiap departemen, secara menurun. Argumen yang lebih awal adalah kunci utama; argumen sesudahnya memutuskan jika ada nilai yang sama. Di dplyr: arrange(df, dept, desc(salary)).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai