为什么 unique 命令的行为类似于 intersect 命令?

Why does unique command act like intersect command?

我已经检查了问题,但找不到任何解释。

所以我有两个向量,我只想选择一个有而另一个没有的不同元素。

我假设为向量定义如下:

hypo1=c("a01","a02","a03","a04","b01","b02","b03","b04","c01","c02","c03","c04")
hypo2=c("a03","a04","b01","b02","c02","c03")

然后想查看这两个向量中的重复项。

intersect(hypo1,hypo2)
[1] "a03" "a04" "b01" "b02" "c02" "c03"

这看起来工作正常。

但是,当我想查看 hypo1 具有而 hypo2 没有的唯一元素时,我在第一个向量中恢复了所有元素。如:

unique(hypo1,hypo2)
 [1] "a01" "a02" "a03" "a04" "b01" "b02" "b03" "b04" "c01" "c02" "c03" "c04"

然后我改变了我创建的向量的顺序,它给出了相交命令的结果,比如

unique(hypo2,hypo1)
[1] "a03" "a04" "b01" "b02" "c02" "c03"

我在网上做了一些挖掘,但找不到我遗漏的东西。我需要找到一个数据具有而另一个数据没有的独特元素。

你想要setdiff(hypo2, hypo1)unique(hypo2, hypo1) 的意思完全不同:它意味着您想要 hypo2 中的唯一条目,但如果它们在 hypo1 中列出,则允许重复值。这在帮助页面 ?unique.

上有解释

例如,

unique(c(1,2,2,3,3,4,4,4), c(3,4))

给予

[1] 1 2 3 3 4 4 4

因为3和4已经声明为"incomparables"。另一方面,

setdiff(c(1,2,2,3,3,4,4,4), c(3,4))

给予

[1] 1 2

这就是我认为您正在寻找的东西。

Unique 只允许一个向量作为参数x。第二个向量将用作参数 incomparables。从 ?unique 我们了解到这些值

will never be marked as duplicated. This is intended to be used for a fairly small set of values and will not be efficient for a very large set.

提取重叠/不同值的一种方法是:

hypo1[!hypo1 %in% hypo2]
# [1] "a01" "a02" "b03" "b04" "c01" "c04"
hypo1[hypo1 %in% hypo2]
# [1] "a03" "a04" "b01" "b02" "c02" "c03"

由于 setdiff 与第一行的结果相同,因此对于适当大小的数据集来说,基准测试是必要的,以显示性能差异。