2013-03-26 28 views
13

Così ho un set di dati in R con la seguente disposizione come esempio:Rimuovere tutti i duplicati tranne ultima istanza

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 

voglio rimuovere tutte le istanze tranne l'istanza ultima delle id. In questo momento tutto quello che posso trovare online, e le funzioni che sto usando è la rimozione di tutto tranne la prima istanza.

Quindi la mia nuova cornice di dati sarà simile:

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

Come posso fare questo? Al momento sono solo in grado di mantenere la prima istanza. Voglio che faccia il contrario? Qualsiasi aiuto?

Orso con me Sono nuovo di R :)

risposta

9

Usa !rev(duplicated(rev(ID))) per filtrare tutti, ma gli ultimi avvenimenti unici.

per ottenere il set di dati filtrato, utilizzare dataset[!rev(duplicated(rev(dataset$ID))),]

10

Non sarebbe questo essere solo il caso standard per l'utilizzo del parametro 'fromLast' a 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 

Il tuo esempio non era abbastanza ricco per dire se avevi bisogno la colonna "Data" nel test fro la duplicazione, quindi forse si potrebbe semplificare. Lo lascio per illustrare che duplicated ha un metodo data.frame. Preferisco !duplicated a unique perché consente un facile accesso al complemento impostato se si confrontano i gruppi.

+0

(+1) Effettivamente. :-) Tuttavia, ho un problema con 'duplicated.data.frame', perché il codice è fondamentalmente' duplicato (do.call ("incolla", c (x, sep = "\ r")), fromLast = fromLast) ', che, come sottolinea la pagina di aiuto," potrebbe essere imperfetto se il frame di dati ha caratteri con ritorni a capo incorporati o colonne che non mappano in modo affidabile ai caratteri ". –

4

utilizzando un data.table join, è possibile impostare mult = 'last'

Per esempio

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 

Se tu conoscessi gli ID univoci si potrebbe anche uno dei seguenti

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

Uso dplyr:

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