Jednym ze sposobów jest odwrotne sortowanie danych i użycie ich duplicateddo usunięcia wszystkich duplikatów. Dla mnie ta metoda jest koncepcyjnie prostsza niż te, które mają zastosowanie. Myślę, że powinien być również bardzo szybki.
# 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
Edycja: Właśnie zdałem sobie sprawę, że powyższe sortowanie odwrotne w ogóle nie wymaga sortowania id. Możesz po prostu użyć z[order(z$var, decreasing=TRUE),]zamiast tego i będzie działać równie dobrze.
Jeszcze jedna myśl ... Jeśli varkolumna jest liczbowa, istnieje prosty sposób sortowania, który idjest rosnący, ale varmalejący. Eliminuje to potrzebę sortowania na końcu (zakładając, że nawet chciałeś go posortować).
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