Ich habe einen Datenrahmen, der einige doppelte IDs enthält. Ich möchte Datensätze mit doppelten IDs entfernen und nur die Zeile mit dem Maximalwert beibehalten.
Also für so strukturiert (andere Variablen nicht gezeigt):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Ich möchte folgendes generieren:
id var_1
1 4
2 3
3 5
4 2
Ich kenne unique () und duplicated (), aber ich kann nicht herausfinden, wie ich die Maximierungsregel einbauen soll ...
Antworten:
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.Bearbeiten: Ich habe gerade festgestellt, dass die umgekehrte Sortierung oben überhaupt nicht sortieren muss
id
. Sie könntenz[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 , abervar
absteigend. Dies macht die Sortierung am Ende überflüssig (vorausgesetzt, Sie wollten sogar, dass sie sortiert wird).quelle
Sie möchten tatsächlich das maximale Element aus den Elementen mit derselben ID auswählen. Dafür können Sie
ddply
aus dem Paket plyr folgendes verwenden :unique
undduplicated
dient zum Entfernen doppelter Datensätze. In Ihrem Fall haben Sie nur doppelte IDs, keine Datensätze.Update: Hier ist der Code, wenn es zusätzliche Variablen gibt:
quelle
Die Base-R-Lösung würde folgendermaßen
split
aussehen:split
Teilt den Datenrahmen in eine Liste von Blöcken auf, in denen auf die einzelne Zeile mit dem Maximalwert geschnitten wird, unddo.call(rbind,...)
reduziert dann die Liste der einzelnen Zeilen wieder in einen Datenrahmen.quelle
ave
ist ein Wrapper vonlapply
+split
, überprüfen Sie den Code (-;order
; für allgemeinere Problemesplit
ist unvermeidlich.Ich benutze lieber
ave
quelle
Noch eine andere Möglichkeit, dies mit base zu tun:
Ich bevorzuge jedoch die Plyr-Lösung von mpiktas.
quelle
Wenn sich die Spalte var wie im Beispiel bereits in aufsteigender Reihenfolge befindet, müssen wir den Datenrahmen nicht sortieren. Wir verwenden nur die Funktion,
duplicated
die das Argument übergibtfromLast = TRUE
, sodass die Duplizierung von der Rückseite aus betrachtet wird und die letzten Elemente beibehalten werden:Andernfalls sortieren wir den Datenrahmen zuerst in aufsteigender Reihenfolge:
Verwendung des
dplyr
Pakets:quelle