我正在尝试识别未包含在另一个向量中的元素。例如,我有两个载体
list.a <- c("James", "Mary", "Jack", "Sonia", "Michelle", "Vincent")
list.b <- c("James", "Sonia", "Vincent")
有没有办法验证哪些人不重叠?在示例中,我希望获得包含Mary,Jack和Michelle的矢量结果。
任何建议都会有所帮助!
答案 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
中有四个x
,9
中有一个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的情况,因为它发现了两次