Mam ramkę danych, która zawiera zduplikowane identyfikatory. Chcę usunąć rekordy ze zduplikowanymi identyfikatorami, zachowując tylko wiersz o maksymalnej wartości.
Więc dla takiej struktury (inne zmienne nie pokazane):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Chcę wygenerować to:
id var_1
1 4
2 3
3 5
4 2
Wiem o unikalnych () i zduplikowanych (), ale nie mogę wymyślić, jak zastosować zasadę maksymalizacji ...
Odpowiedzi:
Jednym ze sposobów jest odwrotne sortowanie danych i użycie ich
duplicated
do usunięcia wszystkich duplikatów. Dla mnie ta metoda jest koncepcyjnie prostsza niż te, które mają zastosowanie. Myślę, że powinien być również bardzo szybki.Edycja: Właśnie zdałem sobie sprawę, że powyższe sortowanie odwrotne w ogóle nie wymaga sortowania
id
. Możesz po prostu użyćz[order(z$var, decreasing=TRUE),]
zamiast tego i będzie działać równie dobrze.Jeszcze jedna myśl ... Jeśli
var
kolumna jest liczbowa, istnieje prosty sposób sortowania, któryid
jest rosnący, alevar
malejący. Eliminuje to potrzebę sortowania na końcu (zakładając, że nawet chciałeś go posortować).źródło
W rzeczywistości chcesz wybrać maksymalny element spośród elementów o tym samym identyfikatorze. Do tego możesz użyć
ddply
z plyr pakietu :unique
iduplicated
służy do usuwania zduplikowanych rekordów, w twoim przypadku masz tylko zduplikowane identyfikatory, a nie rekordy.Aktualizacja: Oto kod, gdy istnieją dodatkowe zmienne:
źródło
Rozwiązanie Base-R wymagałoby
split
:split
dzieli ramkę danych na listę kawałków, na których wykonujemy cięcie do pojedynczego wiersza z maksymalną wartością, a następnie ponowniedo.call(rbind,...)
zmniejsza listę pojedynczych wierszy do ramki danych.źródło
ave
to opakowanielapply
+split
, sprawdź kod (-;order
; ponieważ bardziej ogólne problemysplit
są nieuniknione.Wolę używać
ave
źródło
Jeszcze inny sposób na zrobienie tego z bazą:
Wolę jednak rozwiązanie plyr mpiktas.
źródło
Jeśli, podobnie jak w przykładzie, kolumna var jest już w porządku rosnącym, nie musimy sortować ramki danych. Po prostu używamy funkcji
duplicated
przekazującej argumentfromLast = TRUE
, więc duplikacja jest rozważana z drugiej strony, zachowując ostatnie elementy:W przeciwnym razie najpierw posortujemy ramkę danych w porządku rosnącym:
Używając
dplyr
pakietu:źródło