R中==和%in%运算符之间的区别[重复]

Posted

技术标签:

【中文标题】R中==和%in%运算符之间的区别[重复]【英文标题】:Difference between the == and %in% operators in R [duplicate] 【发布时间】:2017-07-27 00:00:13 【问题描述】:

我的问题涉及 R 中 ==%in% 运算符之间的实际区别。

我在工作中遇到了一个实例,其中使用任一运算符进行过滤会产生不同的结果(例如,一个结果在 800 行上,另一个在 1200 行上)。我过去曾遇到过这个问题,并且能够以确保我得到我想要的结果的方式进行验证。但是,我仍然对它们的不同之处感到困惑。

有人能解释一下这些运算符有何不同吗?

【问题讨论】:

文档文件没有帮助吗? 【参考方案1】:

%in%值匹配 并且“返回其第二个参数的(第一个)匹配位置的向量”(参见help('%in%'))这意味着您可以比较不同的长度来查看一个向量的元素是否与另一个向量中的至少一个元素匹配。输出的长度将等于被比较向量的长度(第一个)。

1:2 %in% rep(1:2,5)
#[1] TRUE TRUE

rep(1:2,5) %in% 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

#Note this output is longer in second

==逻辑运算符,用于比较两个事物是否完全相等。如果向量的长度相等,则元素将按元素进行比较。如果没有,向量将被回收。输出的长度将等于较长向量的长度。

1:2 == rep(1:2,5)
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

rep(1:2,5) == 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

1:10 %in% 3:7
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

#is same as 

sapply(1:10, function(a) any(a == 3:7))
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

注意:如果可能,请尝试使用identicalall.equal 而不是== 和。

【讨论】:

【参考方案2】:

给定两个向量,x 和 y,代码 x == y 会将 x 的第一个元素与 y 的第一个元素进行比较,然后将 x 的第二个元素与 y 的第二个元素进行比较, 等等。使用 x == y 时,x 和 y 的长度必须相同。这里,compare的意思是“等于”,因此输出是一个逻辑向量,等于x(或y)的长度。

在代码x %in% y中,将x的第一个元素与y中的所有元素进行比较,然后将x的第二个元素与y 的所有 元素,依此类推。在这里,比较的意思是“x 的当前元素等于 y 中的任何值”,因此输出是一个逻辑向量,它具有与 x 相同的长度,而不是(必然)y。

这里有一个代码 sn-p 说明了区别。请注意,x 和 y 具有相同的长度,但 y 的元素是 x 的元素的不同顺序。在最后的示例中还要注意,x 是一个 3 元素向量,与包含 26 个元素的 letters 向量进行比较。

> x <- c('a','b','c')
> y <- c('c', 'b', 'a')
> x == y
[1] FALSE  TRUE FALSE

> x %in% y
[1] TRUE TRUE TRUE

> x %in% letters
[1] TRUE TRUE TRUE

> letters %in% x
 [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [7] FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE

【讨论】:

【参考方案3】:

尝试不同长度的物体。

ac <- c("a", "b", "c")
ae <- c("a", "b", "c", "d", "e")
ac %in% ae
[1] TRUE TRUE TRUE
ac == ae
[1]  TRUE  TRUE  TRUE FALSE FALSE

很明显%in% 检查对象是否包含在另一个对象中。而== 是一个检查身份属性的逻辑运算符。

【讨论】:

【参考方案4】:

== 检查一个向量的元素是否等于另一个向量的所有元素。理想情况下,两个向量将具有相同的大小(或者当大小不匹配时会产生意想不到的结果,如果大小是彼此的倍数,R 会默默地回收较短的向量)。比如

c(1,2,3) == c(1,3,2)
[1]  TRUE FALSE FALSE

c(1,2) == c(1,3,2)
[1]  TRUE FALSE FALSE
Warning message:
In c(1, 2) == c(1, 3, 2) :
  longer object length is not a multiple of shorter object length

另一方面,%in% 检查列表 1 的哪些元素包含在列表 2 中

c(1,2,3) %in% c(1,3,2)
[1]  TRUE TRUE TRUE

c(1,2) %in% c(1,3,2)
[1] TRUE TRUE

【讨论】:

我认为你对== 所做的事情的描述不太准确

以上是关于R中==和%in%运算符之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

r %in% 运算符 |控制大小写敏感性[重复]

-> 和 之间的区别。对于成员选择运算符 [重复]

C ++取消引用和使用点运算符与使用箭头运算符之间有区别[重复]

在c或c ++中通过结构对象变量创建树的点运算符和箭头运算符之间的区别[重复]

JavaScript中==和===之间的区别[重复]

“:”和“|”之间的区别在 R 线性建模中