【发布时间】:2010-12-22 17:14:05
【问题描述】:
在 matlab 中,有一种方法可以在一个向量中找到值,但在另一个向量中却找不到。
例如:
x <- c(1,2,3,4)
y <- c(2,3,4)
是否有任何函数可以告诉我 x 中的值不在 y 中是 1?
【问题讨论】:
在 matlab 中,有一种方法可以在一个向量中找到值,但在另一个向量中却找不到。
例如:
x <- c(1,2,3,4)
y <- c(2,3,4)
是否有任何函数可以告诉我 x 中的值不在 y 中是 1?
【问题讨论】:
您可以使用 setdiff()(设置差异)函数:
> setdiff(x, y)
[1] 1
【讨论】:
setdiff(x,y) 和 setdiff(y,x) 不一样。
是的。对于向量,您可以简单地使用 %in% 运算符或 is.element() 函数。
> x[!(x %in% y)]
1
对于矩阵,有许多不同的方法。 merge() 可能是最直接的。我建议looking at this question for that scenario。
【讨论】:
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
【讨论】:
x[is.na(match(x,y))]
【讨论】:
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
【讨论】:
如果:
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))]
如果目标是在x 中找到y 中不存在的值/字符,会给你正确的答案[1] 1。
但是,应用上述表达式可能会很棘手,并且可能会根据向量的性质以及表达式中 x 和 y 的位置而产生不良结果。例如,如果:
x <- c(1,1,2,2,3,4)
y <- c(2,3,4)
目标只是在x 中找到唯一值/字符,而y 中不存在,反之亦然。应用这些表达式中的任何一个仍然会给出正确答案[1] 1:
union(setdiff(x, y), setdiff(y, x))
感谢Jeromy Anglim的贡献
或者:
difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)
感谢Workhouse的贡献
【讨论】: