我正在寻找一种从矢量中删除所有重复元素的方法,包括 引用 元素。通过 reference 元素,我指的是当前用于比较的元素,以搜索其重复项。例如,如果我们考虑这个向量:
a = c(1,2,3,3,4,5,6,7,7,8)
我想获得:
b = c(1,2,4,5,6,8)
我知道duplicated()
和unique()
,但他们没有提供我想要的结果。
答案 0 :(得分:4)
这是一种方式:
a[!(duplicated(a) | rev(duplicated(rev(a))))]
# [1] 1 2 4 5 6 8
答案 1 :(得分: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
选择权在你手中。
答案 2 :(得分: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