Một cách là sắp xếp ngược dữ liệu và sử dụng duplicatedđể loại bỏ tất cả các bản sao. Đối với tôi, phương pháp này đơn giản hơn về mặt khái niệm so với phương pháp sử dụng. Tôi nghĩ rằng nó cũng sẽ rất nhanh.
# 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
Chỉnh sửa: Tôi chỉ nhận ra rằng sắp xếp ngược lại ở trên thậm chí không cần phải sắp xếp lại id. Bạn chỉ có thể sử dụng z[order(z$var, decreasing=TRUE),]thay thế và nó sẽ hoạt động tốt.
Thêm một suy nghĩ nữa ... Nếu varcột là số, thì có một cách đơn giản để sắp xếp sao cho idtăng dần, nhưng vargiảm dần. Điều này giúp loại bỏ sự cần thiết của sắp xếp ở cuối (giả sử bạn thậm chí muốn nó được sắp xếp).
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