Una forma es ordenar en reversa los datos y usar duplicated
para 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 var
columna es numérica, entonces hay una manera simple de ordenar de manera id
ascendente, pero var
descendente. 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