如何判断一个向量而不是另一个向量?

时间:2009-12-03 06:06:03

标签: r vector

在matlab中,有一种方法可以在一个向量中找到值,但在另一个向量中却找不到。

例如:

x <- c(1,2,3,4)
y <- c(2,3,4)

是否有任何函数可以告诉我x中不在y的值是1?

6 个答案:

答案 0 :(得分:101)

你可以使用setdiff()(设置差异)函数:

> setdiff(x, y)
[1] 1

答案 1 :(得分:52)

是。对于矢量,您只需使用%in%运算符或is.element()函数。

> x[!(x %in% y)]
1

对于矩阵,有许多不同的方法。 merge()可能是最直接的。我建议looking at this question for that scenario

答案 2 :(得分:25)

R中setdiff, union, intersect, setequal, and is.element的帮助文件提供了有关R中标准集函数的信息。

setdiff(x, y)会返回不在x中的y元素。

如上所述,这是一种不对称的差异。 例如:

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5

答案 3 :(得分:12)

x[is.na(match(x,y))]

答案 4 :(得分:4)

setdiff()是一个棘手的函数,因为输出取决于输入的顺序。您可以改写一个简单的函数,使其与intersect完全相反。这样好多了。

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5

答案 5 :(得分:1)

如果:

x <- c(1,2,3,4)
y <- c(2,3,4)

以下任何一种表达方式:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]
如果目标是要找到[1] 1中没有的值/字符,那么

将为您提供正确的答案x

但是,根据向量的性质以及表达式中x和y的位置,应用上述表达式可能会很棘手,并且可能会产生不希望的结果。例如,如果:

y

,目标只是在x <- c(1,1,2,2,3,4) y <- c(2,3,4) 中找到唯一的值/字符,而在x中不存在,反之亦然。应用这些表达式中的任何一个仍将给出正确的答案y

[1] 1

感谢Jeromy Anglim

OR:

union(setdiff(x, y), setdiff(y, x))

感谢Workhouse