2013-03-26 13 views
13

Więc mam zestaw danych w R z następującym układzie jak na przykładzie:Usuń wszystkie duplikaty z wyjątkiem ostatniej instancji

ID Date Tally 
1 2/1/2011 1 
2 2/1/2011 2 
3 2/1/2011 3 
1 2/1/2011 4 
2 2/1/2011 5 
1 2/1/2011 6 
3 2/1/2011 7 
4 2/1/2011 8 
2 2/1/2011 9 

Chcę usunąć wszystkie instancje z wyjątkiem ostatniego wystąpienia ID postu. Teraz wszystko, co mogę znaleźć w Internecie, a funkcje, których używam, to usuwanie wszystkiego poza PIERWSZĄ instancją.

Więc moja nowa ramka danych będzie wyglądać następująco:

ID Date Tally 
1 2/1/2011 6 
3 2/1/2011 7 
4 2/1/2011 8 
2 2/1/2011 9 

jaki sposób mogę to zrobić? W tej chwili mogę zachować tylko pierwszą instancję. Chcę, żeby było odwrotnie? Jakaś pomoc?

pokrywa się ze mną Jestem nowy na R :)

Odpowiedz

9

Korzystanie !rev(duplicated(rev(ID))) odfiltrować wszystkie oprócz ostatniego unikalnych zjawisk.

Aby zbiór danych filtrowane, użyj dataset[!rev(duplicated(rev(dataset$ID))),]

10

nie byłoby to po prostu średnia przypadku za pomocą parametru „fromLast” to duplicated?

dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),] 
#--------- 
    ID  Date Tally 
6 1 2/1/2011  6 
7 3 2/1/2011  7 
8 4 2/1/2011  8 
9 2 2/1/2011  9 

Twój przykład nie był wystarczająco bogaty, aby stwierdzić, czy potrzebne kolumny „Data” w teście fro powielania, więc chyba można uprościć. Zostawiam to w celu zilustrowania, że ​​duplicated ma metodę data.frame. Wolę od !duplicated do unique, ponieważ umożliwia łatwy dostęp do zestawu uzupełniającego, jeśli porównasz grupy.

+0

(+1) Rzeczywiście. :-) Mam jednak problem z 'duplicate.data.frame', ponieważ kod jest w zasadzie' zduplikowany (do.call ("wklej", c (x, sep = "\ r")), fromLast = fromLast) ', co, jak wskazuje strona pomocy," może być niedoskonałe, jeśli ramka danych zawiera znaki z osadzonymi powrotami karetki lub kolumnami, które nie są niezawodnie odwzorowywane na znaki ". –

4

używając data.table dołączyć można ustawić mult = 'last'

Na przykład

library(data.table) 
DT <- data.table(DF, key = 'id') 

# join with the unique ID values 
DT[unique(DT[,list(ID)]), mult= 'last'] 

    ID  Date Tally 
1: 1 2/1/2011  6 
2: 2 2/1/2011  9 
3: 3 2/1/2011  7 
4: 4 2/1/2011  8 

Gdybyś wiedział unikalne identyfikatory można było także jedną z poniższych

DT[.(1:4), mult='last'] 
DT[list(1:4), mult = 'last'] 
1

Korzystanie dplyr:

data <- data %>% 
    group_by(ID) %>% 
    slice(which.max(Tally))