Elimine todas las filas duplicadas, incluida la fila “referencia”

Estoy buscando una manera de eliminar todos los elementos duplicados de un vector, incluido el elemento de referencia . Por elemento de referencia me refiero al elemento que se usa actualmente en las comparaciones, para buscar sus duplicados. Por ejemplo, si consideramos este vector:

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

Me gustaría obtener:

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

Estoy al tanto de duplicated() y unique() pero no proporcionan el resultado que estoy buscando.

Aquí hay una forma:

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

Me hice la misma pregunta (y necesitaba hacerlo rápidamente), así que se me ocurrieron estas soluciones:

 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 decisión es tuya.

Aquí hay una solución para encontrar las ocurrencias duplicadas con sus ocurrencias “originales” (y no solo las ocurrencias duplicadas como con las 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