为什么unique命令就像交叉命令一样?

时间:2017-10-05 09:51:59

标签: r unique intersect

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

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

我假设向矢量定义为:

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"

我在网上做了一些挖掘,但我找不到我错过的东西。我需要找到一个数据所具有的唯一元素而其他数据没有。

2 个答案:

答案 0 :(得分:3)

你想要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被宣布为“不相容”。另一方面,

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

给出

[1] 1 2

这是我认为你在寻找的。

答案 1 :(得分:3)

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

  

永远不会被标记为重复。这旨在用于一组相当小的值,并且对于非常大的集合而言效率不高。

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

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

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