Rimuovi tutte le righe duplicate inclusa la riga “di riferimento”

Sto cercando un modo per rimuovere tutti gli elementi duplicati da un vettore, incluso l’elemento di riferimento . Per elemento di riferimento intendo l’elemento attualmente utilizzato nei confronti, per cercare i suoi duplicati. Ad esempio, se consideriamo questo vettore:

a = c(1,2,3,3,4,5,6,7,7,8) 

Vorrei ottenere:

 b = c(1,2,4,5,6,8) 

Sono a conoscenza di duplicated() e unique() ma non forniscono il risultato che sto cercando.

Ecco un modo:

 a[!(duplicated(a) | rev(duplicated(rev(a))))] # [1] 1 2 4 5 6 8 

Mi sono posto la stessa domanda (e avevo bisogno di farlo rapidamente), quindi ho trovato queste soluzioni:

 u =sample(x=1:10E6, size = 1000000, replace=T) s1 <- function() setdiff(u, u[duplicated(u)]) s2 <- function() u[!duplicated(u) & !duplicated(u, fromLast=T)] s3 <- function() u[!(duplicated(u) | rev(duplicated(rev(u))))] s4 <- function() u[!u %in% u[duplicated(u)]] s5 <- function() u[!match(u, u[duplicated(u)], nomatch = 0)] s6 <- function() u[!is.element(u, u[duplicated(u)])] s7 <- function() u[!duplicated2(u)] library(rbenchmark) benchmark(s1(), s2(), s3(), s4(), s5(), s6(), s7(), replications = 10, columns = c("test", "elapsed", "relative"), order = "elapsed") test elapsed relative 5 s5() 1.95 1.000 4 s4() 1.98 1.015 6 s6() 1.98 1.015 2 s2() 2.49 1.277 3 s3() 2.92 1.497 7 s7() 3.04 1.559 1 s1() 3.06 1.569 

La scelta è tua.

ecco una soluzione per trovare le occorrenze duplicate con e le loro occorrenze “originali” (e non solo le occorrenze duplicate come con duplicated ).

 duplicated2 <- function(x){ dup <- duplicated(x) if (sum(dup) == 0) return(dup) duplicated(c(x[dup], x))[-(1:sum(dup))] } a <- c(1,2,3,3,4,5,6,7,7,8) > a[!duplicated2(a)] [1] 1 2 4 5 6 8