如何识别R中向量中只出现一次的元素索引?

时间:2017-01-26 13:56:11

标签: r unique

我希望有一个逻辑向量,用于标识仅在数据帧的列中出现一次的元素的位置。

据我所知unique()duplicated()基本R函数无法提供帮助,因为它们显示重复删除的值列表或重复位置。

使用table()函数可以识别出现一次但不是用于进一步数据操作的位置的值。有什么建议?非常感谢

2 个答案:

答案 0 :(得分:3)

x成为你的向量,例如:

set.seed(1)
x <- sample(1:10, 10 ,replace = T)

您可以分两步完成:

var.names <- names(table(x))[table(x) == 1]
match(var.names, x)

要获得var.names,您也可以这样做:

names(which(table(x) == 1))

答案 1 :(得分:0)

这里有很多答案。我以为我会比较他们的计算时间

x <- rbinom(500, 1000, 0.5)

microbenchmark::microbenchmark(
  x[which(!(duplicated(x)|duplicated(x, fromLast=TRUE)))], 
  x[ave(x, x, FUN = length) == 1], 
  setdiff(unique(x),x[duplicated(x)]), 
  names(which(table(x) == 1))
)

输出为

Unit: microseconds
                                                        expr     min       lq      mean  median
 x[which(!(duplicated(x) | duplicated(x, fromLast = TRUE)))]  22.517  26.2880  28.75954  29.460
                             x[ave(x, x, FUN = length) == 1] 247.923 256.4725 265.80232 262.290
                        setdiff(unique(x), x[duplicated(x)])  38.706  41.1915  45.58309  46.278
                                 names(which(table(x) == 1)) 194.656 204.4935 213.87719 213.388
      uq     max neval  cld
  31.036  41.033   100 a   
 266.321 461.379   100    d
  48.546  71.819   100  b  
 219.536 290.785   100   c 

所以胜利者是x[which(!(duplicated(x)|duplicated(x, fromLast=TRUE)))]