2011-10-21 3 views
68

R duplicated restituisce un vettore che mostra se ciascun elemento di un vettore o di un frame di dati è un duplicato di un elemento con un indice più piccolo. Quindi, se le righe 3, 4 e 5 di un frame di dati a 5 righe sono gli stessi, duplicated mi darà il vettoreTrovare TUTTE le righe duplicate, inclusi "elementi con indici minori"

FALSE, FALSE, FALSE, TRUE, TRUE 

Ma in questo caso ho effettivamente desidera ottenere

FALSE, FALSE, TRUE, TRUE, TRUE 

che è, voglio sapere se una riga è duplicata da una riga con un indice più grande anche.

risposta

74

duplicated ha un argomento fromLast. La sezione "Esempio" di ?duplicated mostra come usarlo. Basta chiamare lo duplicated due volte, una volta con fromLast=FALSE e una volta con fromLast=TRUE e prendere le righe dove sono TRUE.


Qualche ritardo Edit: Non hai fornito un esempio riproducibile, quindi ecco un'illustrazione gentilmente contribuito con @jbaums

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)] 
## [1] "c" "c" "c" 
+1

Ma questa soluzione non presuppone che ci siano solo 2 valori duplicati? Cosa succede se ci sono più di 2? Quelli di mezzo saranno ignorati So che il significato letterale della parola "duplicato" implica "duplice", ma una soluzione più robusta sarebbe quella di @ 42, sì? – JoeM05

+2

Aspetta, ho appena eseguito un test e ho scoperto che avevo torto: 'x <- c (1: 9, 7:10, 5:22); y <- c (lettere, lettere [1: 5]); test <- data.frame (x, y); test [duplicato (test $ x) | duplicato (test $ x, fromLast = TRUE),] ' Ha restituito tutte e tre le copie di 7, 8 e 9. Perché funziona? – JoeM05

+0

Perché quelli di mezzo vengono catturati, non importa se si parte dalla fine o dalla parte anteriore. Ad esempio, 'duplicato (c (1,1,1))' vs 'duplicato (c (1,1,1,), fromLast = TRUE)' dà 'c (FALSE, TRUE, TRUE)' e 'c (VERO, VERO, FALSO) '. Il valore medio è "VERO" in entrambi i casi. Prendendo '|' di entrambi i vettori dà 'c (TRUE, TRUE, TRUE)'. – Brandon

24

È necessario assemblare il set di valori duplicated, applicare unique e quindi verificare con %in%. Come sempre, un esempio di problema renderà questo processo vivo.

> vec <- c("a", "b", "c","c","c") 
> vec[ duplicated(vec)] 
[1] "c" "c" 
> unique(vec[ duplicated(vec)]) 
[1] "c" 
> vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE TRUE TRUE TRUE 
3

ho avuto il same question, e se non sono errato, questa è anche una risposta.

vec[col %in% vec[duplicated(vec$col),]$col] 

Boh cui uno è più veloce, però, il set di dati Attualmente sto usando non è abbastanza grande per fare i test che producono significativi intervalli di tempo.