Saya memiliki bingkai data yang berisi beberapa id duplikat. Saya ingin menghapus catatan dengan id duplikat, hanya menjaga baris dengan nilai maksimum.
Jadi untuk terstruktur seperti ini (variabel lain tidak diperlihatkan):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Saya ingin menghasilkan ini:
id var_1
1 4
2 3
3 5
4 2
Saya tahu tentang unik () dan digandakan (), tetapi saya tidak tahu cara memasukkan aturan maksimalisasi ...
Jawaban:
Salah satu caranya adalah membalikkan data dan menggunakannya
duplicated
untuk menjatuhkan semua duplikat. Bagi saya, metode ini secara konsep lebih sederhana daripada yang digunakan berlaku. Saya pikir itu harus sangat cepat juga.Sunting: Saya baru menyadari bahwa penyortir terbalik di atas bahkan tidak perlu disortir
id
sama sekali. Anda bisa menggunakanz[order(z$var, decreasing=TRUE),]
saja dan itu akan berfungsi dengan baik.Satu lagi pemikiran ... Jika
var
kolom itu numerik, maka ada cara sederhana untuk mengurutkan sehinggaid
naik, tetapivar
menurun. Ini menghilangkan kebutuhan untuk menyortir di akhir (dengan asumsi Anda bahkan ingin diurutkan).sumber
Anda sebenarnya ingin memilih elemen maksimum dari elemen dengan id yang sama. Untuk itu Anda bisa menggunakan
ddply
dari plyr paket :unique
danduplicated
untuk menghapus rekaman duplikat, dalam kasus Anda, Anda hanya memiliki id duplikat, bukan catatan.Pembaruan: Ini adalah kode ketika ada variabel tambahan:
sumber
Solusi base-R akan melibatkan
split
, seperti ini:split
memecah frame data menjadi daftar potongan, di mana kami melakukan pemotongan ke baris tunggal dengan nilai maksimal dan kemudiando.call(rbind,...)
mengurangi daftar baris tunggal ke dalam bingkai data lagi.sumber
ave
adalah pembungkuslapply
+split
, periksa kode (-;order
; untuk masalah yang lebih umumsplit
tidak bisa dihindari.Saya lebih suka menggunakan
ave
sumber
Namun cara lain untuk melakukan ini dengan basis:
Saya lebih suka solusi plyr mpiktas 'sekalipun.
sumber
Jika, seperti pada contoh, kolom var sudah dalam urutan menaik, kita tidak perlu mengurutkan bingkai data. Kami hanya menggunakan fungsi yang
duplicated
melewati argumenfromLast = TRUE
, jadi duplikasi dianggap dari sisi sebaliknya, menjaga elemen terakhir:Kalau tidak, kita mengurutkan frame data dalam urutan naik terlebih dahulu:
Menggunakan
dplyr
paket:sumber