寻找两个向量之间不重叠的元素

时间:2014-02-05 10:11:18

标签: r overlap

我正在尝试识别未包含在另一个向量中的元素。例如,我有两个载体

list.a <- c("James", "Mary", "Jack", "Sonia", "Michelle", "Vincent")

list.b <- c("James", "Sonia", "Vincent")

有没有办法验证哪些人不重叠?在示例中,我希望获得包含Mary,Jack和Michelle的矢量结果。

任何建议都会有所帮助!

4 个答案:

答案 0 :(得分:24)

是的,有办法:

setdiff(list.a, list.b)
# [1] "Mary"     "Jack"     "Michelle"

答案 1 :(得分:4)

我认为应该指出的是,正确答案仅部分正确。 setdiff(list.a, list.b)命令仅在用作第一个参数的对象中包含非重叠元素时才查找

如果您不知道此行为,而是使用setdiff(list.b, list.a),则在这种情况下结果将为character(0),这将使您得出结论,没有不重叠的元素。

使用稍微扩展的示例进行说明,一个明显的快速解决方法是:

list.a <- c("James", "Mary", "Jack", "Sonia", "Michelle", "Vincent")
list.b <- c("James", "Sonia", "Vincent", "Iris")

c(setdiff(list.b, list.a), setdiff(list.a, list.b))
# [1] "Iris"     "Mary"     "Jack"     "Michelle" 

答案 2 :(得分:2)

基于哈德利和我自己的评论的扩展答案:这里是如何允许重复的。

最终编辑:我不建议任何人使用它,因为结果可能不是您所期望的。如果x中的重复值不在y中,您将在输出中看到该值重复。但是:如果9中有四个x9中有一个y,则会移除所有9。人们可能期望保留其中三个;这需要更复杂的代码。

mysetdiff<-function (x, y, multiple=FALSE) 
{
    x <- as.vector(x)
    y <- as.vector(y)
    if (length(x) || length(y)) {
        if (!multiple) {
             unique( x[match(x, y, 0L) == 0L])  
              }else  x[match(x, y, 0L) == 0L] 
        } else x
}

Rgames> x
[1]  8  9  6 10  9
Rgames> y
[1] 5 3 8 8 1
Rgames> setdiff(x,y)
[1]  9  6 10
Rgames> mysetdiff(x,y)
[1]  9  6 10
Rgames> mysetdiff(x,y,mult=T)
[1]  9  6 10  9
Rgames> mysetdiff(y,x,mult=T)
[1] 5 3 1
Rgames> setdiff(y,x)
[1] 5 3 1

答案 3 :(得分:0)

适用于重复的漂亮单行程序:

var array1 = [1,2,3,4,5,6];
var array2 = [3,4,6,8];

var res = array1.filter( i => !array2.includes(i));
var temp = array2.filter( i => !array1.includes(i));
res = res.concat(temp)
console.log(res);

这将返回数据框{2,2}。然而,这并不适用于1,1,2,2中的1,2的情况,因为它发现了两次