Eine Möglichkeit besteht darin, die Daten in umgekehrter Reihenfolge zu sortieren und duplicated
alle Duplikate zu löschen. Für mich ist diese Methode konzeptionell einfacher als die, die zur Anwendung kommen. Ich denke, es sollte auch sehr schnell gehen.
# 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
Bearbeiten: Ich habe gerade festgestellt, dass die umgekehrte Sortierung oben überhaupt nicht sortieren muss id
. Sie könnten z[order(z$var, decreasing=TRUE),]
stattdessen einfach verwenden und es wird genauso gut funktionieren.
Noch ein Gedanke ... Wenn die var
Spalte numerisch ist, gibt es eine einfache Möglichkeit, id
aufsteigend zu sortieren , aber var
absteigend. Dies macht die Sortierung am Ende überflüssig (vorausgesetzt, Sie wollten sogar, dass sie sortiert wird).
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