Una forma es ordenar en reversa los datos y usar duplicatedpara descartar todos los duplicados. Para mí, este método es conceptualmente más simple que los que se aplican. Creo que también debería ser muy rápido.
# 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
Editar: Me acabo de dar cuenta de que la clasificación inversa anterior ni siquiera necesita clasificarse id. En su z[order(z$var, decreasing=TRUE),]lugar, podría usarlo y funcionará igual de bien.
Un pensamiento más ... Si la varcolumna es numérica, entonces hay una manera simple de ordenar de manera idascendente, pero vardescendente. Esto elimina la necesidad de la clasificación al final (suponiendo que incluso quisiera que se clasifique).
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