我们假设以下示例:
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
这使我更接近我想要的,但仍然不是必需的结果(一个相同长度的向量,表明它是否在向量中是唯一的。)
所以任何人都知道如何更容易地做到这一点?
答案 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);