Cara mengurutkan dataframe oleh beberapa kolom(s)
Saya ingin mengurutkan data.bingkai dengan beberapa kolom. Misalnya, dengan data.frame di bawah ini saya ingin mengurutkan berdasarkan kolom z
(turun) maka pada kolom b
(ascending):
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
dd
b x y z
1 Hi A 8 1
2 Med D 3 1
3 Hi A 9 1
4 Low C 9 2
1263
19
Anda dapat menggunakan
order()
fungsi langsung tanpa menggunakan add-on tools -- lihat ini jawaban sederhana yang menggunakan trik yang tepat dari atas `contoh(order) kode:Mengedit beberapa 2+ tahun kemudian: Itu hanya bertanya bagaimana untuk melakukan hal ini dengan indeks kolom. Jawabannya adalah untuk hanya lulus pengurutan yang diinginkan kolom(s) untuk urutan
()
fungsi:daripada menggunakan nama kolom (dan
dengan()
untuk lebih mudah/lebih akses langsung).Pilihan anda
order
daribase
mengatur
daridplyr
setorder
dansetorderv
daridata.meja
mengatur
dariplyr
semacam
daritaRifx
orderBy
daridoBy
sortData
dariDeducer
Sebagian besar waktu anda harus menggunakan
dplyr
ataudata.tabel
solusi, kecuali setelah tidak ada dependensi adalah penting, dalam hal ini menggunakandasar::order
.Saya baru-baru ini ditambahkan semacam.data.bingkai untuk CRAN paket, sehingga kelas yang kompatibel seperti yang dibahas di sini: https://stackoverflow.com/questions/6836963/best-way-to-create-generic-method-consistency-for-sort-data-frame
Oleh karena itu, mengingat data.bingkai dd, anda bisa urutkan sebagai berikut:
Dirk's jawaban yang lebih besar. Ia juga menyoroti perbedaan penting dalam sintaks yang digunakan untuk mengindeks data.frame dan data.tabel:
Perbedaan antara dua panggilan kecil, tetapi hal ini dapat memiliki konsekuensi penting. Terutama jika anda menulis kode produksi dan/atau yang berkaitan dengan kebenaran dalam penelitian anda,'s terbaik untuk menghindari pengulangan yang tidak perlu dari nama variabel.
data.meja
membantu anda melakukan hal ini.Berikut ini's contoh bagaimana pengulangan nama-nama variabel bisa mendapatkan anda ke dalam kesulitan:
Let's mengubah konteks dari Dirk's jawaban, dan mengatakan ini adalah bagian dari proyek yang lebih besar di mana ada banyak nama objek dan mereka yang panjang dan bermakna; bukan
dd
it's disebutquarterlyreport
. Menjadi :Ok, baik-baik saja. Ada yang salah dengan itu. Berikutnya bos anda meminta anda untuk memasukkan kuartal terakhir's laporan dalam laporan. Anda pergi melalui kode anda, menambahkan objek
lastquarterlyreport
di berbagai tempat dan entah bagaimana caranya (bagaimana caranya?) anda berakhir dengan ini :Yang isn't apa yang anda maksud tapi kau tidak't-spot itu karena anda melakukannya dengan cepat dan it's terletak pada sebuah halaman kode yang sama. Kode doesn't jatuh di atas (tidak ada peringatan dan tidak ada kesalahan) karena R berpikir itu adalah apa yang anda maksudkan. Anda'd berharap siapa pun yang membaca laporan anda bintik-bintik ini, tapi mungkin mereka don't. Jika anda bekerja dengan bahasa pemrograman yang banyak maka keadaan ini mungkin semua akrab. Itu adalah "typo" anda'll mengatakan. I'll memperbaiki "typo" anda'll mengatakan kepada atasan anda.
Di
data.tabel
kita're khawatir tentang rincian kecil seperti ini. Jadi kita've melakukan sesuatu yang sederhana untuk menghindari mengetik nama variabel dua kali. Sesuatu yang sangat sederhana.aku
ini dievaluasi dalam kerangkadd
sudah, secara otomatis. Anda don't perludengan()
pada semua.Bukan
it's hanya
Dan bukan
it's hanya
It's perbedaan yang sangat kecil, tapi itu mungkin akan menyelamatkan leher anda satu hari. Ketika menimbang jawaban yang berbeda untuk pertanyaan ini, pertimbangkan untuk menghitung pengulangan nama-nama variabel sebagai salah satu kriteria anda dalam memutuskan. Beberapa jawaban memiliki beberapa mengulangi, yang lain tidak.
Ada banyak jawaban yang sangat baik di sini, tapi dplyr memberikan hanya sintaks yang saya dapat dengan cepat dan mudah diingat (dan sekarang digunakan sangat sering):
Untuk OP's masalah:
R paket data.tabel
menyediakan baik *cepat* dan *memori yang efisien* pemesanan *data.tabel* dengan lugas sintaks (bagian yang Matt telah disorot cukup baik [dalam jawabannya](https://stackoverflow.com/a/10758086/559784)). Di sana telah cukup banyak perbaikan dan juga fungsi baru
setorder()sejak saat itu. Dari
v1.9.5+,
setorder()` juga bekerja dengan data.frame.Pertama, kita'll membuat dataset yang cukup besar dan acuan metode yang berbeda yang disebutkan dari jawaban yang lain dan kemudian daftar fitur data.tabel.
Data:
Tolok ukur:
Timing yang dilaporkan adalah dari menjalankan sistem.waktu(...)` pada fungsi-fungsi ini ditunjukkan di bawah ini. Timing ditabulasikan berikut (dalam urutan dari yang paling lambat ke cepat).
data.tabel
'sDT[order(...)]
sintaks adalah ~10x lebih cepat dari yang tercepat dari metode lain (dplyr
), sementara mengkonsumsi jumlah yang sama dari memori sebagaidplyr
.data.tabel
'ssetorder()
adalah ~14x lebih cepat dari yang tercepat dari metode lain (dplyr
), saat mengambil hanya 0.4 GB memori tambahan.dat
sekarang di order, kami membutuhkan (seperti yang diperbarui oleh referensi).data.tabel fitur:
Kecepatan:
data.tabel's memesan sangat cepat karena menerapkan radix memesan.
Sintaks
DT[order(...)]
dioptimalkan secara internal digunakan data.tabel's cepat memesan juga. Anda dapat tetap menggunakan akrab basis R sintaks tapi mempercepat proses (dan menggunakan memori kurang).Memori:
DF <- DF[order(...)]
Masalahnya adalah bahwa hal ini membutuhkan setidaknya dua kali (2x) memori dari objek asli. Untuk menjadi memori yang efisien, data.tabel oleh karena itu juga menyediakan fungsi
setorder()
.setorder()
menata ulang data.tabelreferensi
(di tempat), tanpa membuat salinan tambahan. Hanya menggunakan memori tambahan sama dengan ukuran satu kolom.Fitur lain:
integer
,logis
,numerik
,karakter
dan bahkanbit64::integer64
jenis.-
pada karakter vektor untuk mengurutkan berdasarkan kolom dalam urutan penurunan. Sebaliknya kita harus menggunakan-xtfrm(.)
.Namun, dalam data.tabel, kita hanya bisa melakukan, misalnya,
dat[order(-x)]
atausetorder(dat, -x)
.Dengan ini (sangat membantu) fungsi oleh Kevin Wright, posted in tips bagian dari R wiki, hal ini mudah dicapai.
atau anda dapat menggunakan paket doBy
Misalkan anda memiliki data.frame
`A
dan anda ingin mengatasinya dengan menggunakan kolomx
urutan. Sebut diurutkandata.frame
newdata
jika SQL datang secara alami kepada anda,
sqldf paket
menanganiORDER BY
as Codd yang dimaksudkan.Atau, menggunakan paket Deducer
Saya belajar tentang
order
dengan contoh berikut yang kemudian saya bingung untuk waktu yang lama:Satu-satunya alasan ini contoh karya adalah karena
pesanan
adalah menyortir olehvektor Usia
, bukan oleh kolom bernamaUsia
didata frame data
.Untuk melihat hal ini membuat data yang identik frame menggunakan
baca.meja
dengan sedikit berbeda, nama kolom dan tanpa menggunakan apapun di atas vektor-vektor:Dirk's jawaban yang lebih baik tetapi jika anda perlu untuk bertahan anda'll ingin menerapkan semacam kembali ke nama yang data frame. Menggunakan contoh kode:
Dalam menanggapi komentar ditambahkan dalam OP untuk cara semacam pemrograman:
Menggunakan
dplyr
dandata.meja
dplyr
Hanya menggunakan
arrange_
, yang merupakan Standar Evaluasi yang versi untukmengatur
.Mengatur() di dplyer adalah pilihan favorit saya. Menggunakan pipa operator dan pergi dari yang paling penting ke yang paling penting aspek
Demi kelengkapan: anda juga dapat menggunakan
sortByCol()
fungsi dariBBmisc
paket:Perbandingan kinerja:
Sama seperti kartu mekanik penyortir lama, pertama urutkan berdasarkan yang paling penting, kemudian yang berikutnya yang paling signifikan, dll. Ada perpustakaan yang diperlukan, bekerja dengan sejumlah tombol dan kombinasi dari naik dan turun tombol.
Hanya demi kelengkapan, sejak tidak banyak yang telah dikatakan tentang pengurutan berdasarkan kolom nomor... Itu pasti dapat dikatakan bahwa hal ini sering tidak diinginkan (karena urutan kolom yang bisa berubah, paving jalan untuk kesalahan), tetapi dalam beberapa situasi tertentu (ketika misalnya anda membutuhkan pekerjaan cepat selesai dan tidak ada risiko dari kolom mengubah pesanan), mungkin menjadi hal yang paling masuk akal untuk dilakukan, terutama ketika berhadapan dengan besar kolom.
Dalam kasus itu,
apakah.call()
datang untuk menyelamatkan:Alternatif lain, menggunakan
rgr
paket:Saya berjuang dengan solusi di atas ketika saya ingin mengotomatisasi saya proses pemesanan untuk n kolom, dan kolom nama-nama bisa berbeda setiap kali. Saya menemukan sangat membantu fungsi dari
psikologi
paket untuk melakukan hal ini dengan cara yang sederhana:di mana
columnIndices
adalah indeks dari satu atau lebih kolom, dalam urutan yang anda inginkan untuk mengurutkan mereka. Informasi lebih lanjut di sini:dfOrder fungsi dari 'psikologi' paket