测试R中的向量中的值是否唯一

时间:2015-08-21 22:34:27

标签: r vector unique

我们假设以下示例:

test<-c(1:5,3:7)

给出了

test
[1] 1 2 3 4 5 3 4 5 6 7

我想有一个简单的函数,如果值在向量中是唯一的,则返回TRUE。

[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE

我尝试了什么:

unique(test)只能让我找回包含重复值的唯一值。 duplicated(test)让我回来了

[1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE FALSE FALSE

这显然不是必需的结果,因为函数按顺序测试重复观察,并且第一次出现不计为重复。我当然可以通过包含fromLast = T来反转控制序列并创建两个向量。在这两个中,我可以创建一个表示真正独特值的第三个......但这很复杂。

table(test)允许我计算每个值的出现次数

test
1 2 3 4 5 6 7 
1 1 2 2 2 1 1 

这使我更接近我想要的,但仍然不是必需的结果(一个相同长度的向量,表明它是否在向量中是唯一的。)

所以任何人都知道如何更容易地做到这一点?

4 个答案:

答案 0 :(得分:7)

匹配运算符%in%非常有用。

!test %in% test[duplicated(test)]

答案 1 :(得分:2)

您最初建议将duplicated()的{​​{1}}开关与OR运算符结合使用,这似乎是一个简单而优雅的解决方案:

fromLast = TRUE

当使用data.table按组执行操作时,此方法非常好,如果变量名是行值或组列向量,则语法会使该模棱两可。

答案 2 :(得分:1)

test<-c(1:5,3:7)
isUnique <- function(vector){
                 return(!any(duplicated(vector)))
           }
isUnique(test)

如果vector的值是唯一的,该函数将返回true

答案 3 :(得分:0)

尽管有一段时间了,但还是可以选择。让数字说话:

z <- as.character(x)
bm <- microbenchmark(
            "!AllDuplicated(z)"             = AllDuplicated(z),
            "!z %in% z[duplicated(z)]"      = !z %in% z[duplicated(z)]
       )
print(bm , unit="relative" , digits=3 , order="median")

Unit: relative
                     expr  min   lq mean median   uq  max neval cld
 !z %in% z[duplicated(z)] 1.00 1.00 1.00   1.00 1.00 1.00   100   a
        !AllDuplicated(z) 1.09 1.09 0.97   1.06 0.68 1.16   100   a

因此,我们看到DescTools :: AllDuplicated(),该方法实现了joaoal的公式化解决方案思想,以x为数字获胜,但是在处理字符时失败了(尽管仅针对中位数,而不是游程平均值) )。

browser.setViewportSize(size);