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.
# Some data to start with:
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# id var
# 1 2
# 1 4
# 2 1
# 2 3
# 3 5
# 4 2
# Reverse sort
z <- z[order(z$id, z$var, decreasing=TRUE),]
# id var
# 4 2
# 3 5
# 2 3
# 2 1
# 1 4
# 1 2
# Keep only the first row for each duplicate of z$id; this row will have the
# largest value for z$var
z <- z[!duplicated(z$id),]
# Sort so it looks nice
z <- z[order(z$id, z$var),]
# id var
# 1 4
# 2 3
# 3 5
# 4 2
Sunting: Saya baru menyadari bahwa penyortir terbalik di atas bahkan tidak perlu disortir id
sama sekali. Anda bisa menggunakan z[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 sehingga id
naik, tetapi var
menurun. Ini menghilangkan kebutuhan untuk menyortir di akhir (dengan asumsi Anda bahkan ingin diurutkan).
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# Sort: id ascending, var descending
z <- z[order(z$id, -z$var),]
# Remove duplicates
z <- z[!duplicated(z$id),]
# id var
# 1 4
# 2 3
# 3 5
# 4 2