r - 删除R中所有重复项的最快方法

标签 r performance duplicates unique

我想删除在向量中出现多次的所有项目。具体来说,这包括字符、数字和整数向量。目前,我正在使用 duplicated()向前和向后(使用 fromLast 参数)。

在 R 中是否有一种计算效率更高(更快)的方法来执行它?下面的解决方案很简单,可以写/读,但执行重复搜索两次似乎效率低下。也许使用额外数据结构的基于计数的方法会更好?

例子:

d <- c(1,2,3,4,1,5,6,4,2,1)
d[!(duplicated(d) | duplicated(d, fromLast=TRUE))]
#[1] 3 5 6

相关SO帖子herehere .

最佳答案

一些时间:

set.seed(1001)
d <- sample(1:100000, 100000, replace=T)
d <- c(d, sample(d, 20000, replace=T))  # ensure many duplicates
mb <- microbenchmark::microbenchmark(
  d[!(duplicated(d) | duplicated(d, fromLast=TRUE))],
  setdiff(d, d[duplicated(d)]),
  {tmp <- rle(sort(d)); tmp$values[tmp$lengths == 1]},
  as.integer(names(table(d)[table(d)==1])),
  d[!(duplicated.default(d) | duplicated.default(d, fromLast=TRUE))],
  d[!(d %in% d[duplicated(d)])],
  { ud = unique(d); ud[tabulate(match(d, ud)) == 1L] },
  d[!(.Internal(duplicated(d, F, F, NA)) | .Internal(duplicated(d, F, T, NA)))]
)
summary(mb)[, c(1, 4)]  # in milliseconds
#                                                                                expr      mean
#1                               d[!(duplicated(d) | duplicated(d, fromLast = TRUE))]  18.34692
#2                                                       setdiff(d, d[duplicated(d)])  24.84984
#3                       {     tmp <- rle(sort(d))     tmp$values[tmp$lengths == 1] }   9.53831
#4                                         as.integer(names(table(d)[table(d) == 1])) 255.76300
#5               d[!(duplicated.default(d) | duplicated.default(d, fromLast = TRUE))]  18.35360
#6                                                      d[!(d %in% d[duplicated(d)])]  24.01009
#7                        {     ud = unique(d)     ud[tabulate(match(d, ud)) == 1L] }  32.10166
#8 d[!(.Internal(duplicated(d, F, F, NA)) | .Internal(duplicated(d,      F, T, NA)))]  18.33475

鉴于评论让我们看看它们是否全部正确?
 results <- list(d[!(duplicated(d) | duplicated(d, fromLast=TRUE))],
         setdiff(d, d[duplicated(d)]),
         {tmp <- rle(sort(d)); tmp$values[tmp$lengths == 1]},
         as.integer(names(table(d)[table(d)==1])),
         d[!(duplicated.default(d) | duplicated.default(d, fromLast=TRUE))],
         d[!(d %in% d[duplicated(d)])],
         { ud = unique(d); ud[tabulate(match(d, ud)) == 1L] },
         d[!(.Internal(duplicated(d, F, F, NA)) | .Internal(duplicated(d, F, T, NA)))])
 all(sapply(ls, all.equal, c(3, 5, 6)))
 # TRUE

关于r - 删除R中所有重复项的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148567/

相关文章:

r - 单击同一按钮之间的时间间隔 - shiny R

r - Tukey HSD 用于混合连续变量和分类变量,错误 : "no factors"

json - Crystal : slow json serialization of structs containing large strings

mysql - Rails 更新数据库中具有重复 ID 的记录

java - 查找部分重复值并保留特定值

r - 对列值大于阈值的行进行子集化

r - stringr 中的条件正则表达式

cordova - IntelliJ IDEA Phonegap !重复类 : org. apache.cordova.BuildConfig

python - 执行时间不一致

PHP 这是一种更好的方式来提供其 URL 存储在数据库中的图像