2014-02-17 2 views
1

Я ищу способ удалить все повторяющиеся элементы из вектора, включая ссылка элемент. К ссылка элемент Я имею в виду элемент, который в настоящее время используется для сравнения, для поиска его дубликатов. Например, если мы рассмотрим этот вектор:Удалить все повторяющиеся строки, включая строку «reference»

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

Я хотел бы получить:

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

Я отдаю себе отчет в duplicated() и unique(), но они не дают результата, я ищу.

+0

Duplicate: [Как удалить все дубликаты, чтобы в поле данных не осталось ни одного?] (Http://stackoverflow.com/q/13763216/903061) – Gregor

+0

@Gregor предоставленные решения разные – Marius

+0

да, там это несколько способов сделать это. – Gregor

ответ

4

Вот один из способов:

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

приятно. похоже, что он делает именно то, что мне нужно. Спасибо. Надеюсь, что он работает и с кадрами данных, указав, в каком столбце, конечно. – Marius

+2

Должен работать, если вы укажете столбец, возможно, вот так: 'df [! (Duplicated (df $ a) | rev (duplicated (rev (df $ a))))]. Просто будьте осторожны, чтобы не использовать 'rev (df)' для всего data.frame, так как это просто изменит порядок столбцов (а не строк). –

+0

ОК. Будь осторожен:] Еще раз спасибо. – Marius

0

здесь есть решение, чтобы найти дублированные вхождений с и их «оригинальные» вхождений (и не только дублированные вхождений как с 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 
+0

Спасибо, но верхнее решение намного чище. – Marius

4

Я задавал себе тот же вопрос (и я должен был сделать это быстро), поэтому я придумал эти решения:

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 

Выбор за вами.

+0

Благодарим вас за то, что вы указали несколько способов достижения этого. Мне очень полезно увидеть фактическое время, необходимое для выполнения задачи. Я имею дело с довольно большими файлами данных. – Marius

Смежные вопросы