Salah satu caranya adalah membalikkan data dan menggunakannya duplicateduntuk 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 idsama sekali. Anda bisa menggunakan z[order(z$var, decreasing=TRUE),]saja dan itu akan berfungsi dengan baik.
Satu lagi pemikiran ... Jika varkolom itu numerik, maka ada cara sederhana untuk mengurutkan sehingga idnaik, tetapi varmenurun. 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