`%in%`和`==`之间的区别

use*_*502 23 r

df <- structure(list(x = 1:10, time = c(0.5, 0.5, 1, 2, 3, 0.5, 0.5, 
1, 2, 3)), .Names = c("x", "time"), row.names = c(NA, -10L), class = "data.frame")


df[df$time %in% c(0.5, 3), ]
##     x time
## 1   1  0.5
## 2   2  0.5
## 5   5  3.0
## 6   6  0.5
## 7   7  0.5
## 10 10  3.0

df[df$time == c(0.5, 3), ]
##     x time
## 1   1  0.5
## 7   7  0.5
## 10 10  3.0
Run Code Online (Sandbox Code Playgroud)

%in%==这里有什么区别?

seb*_*n-c 28

问题是矢量回收.

你的第一行完全符合你的期望.它检查什么的元素df$time都在c(0.5, 3),并返回它们的值.

你的第二行比较棘手.它实际上相当于

df[df$time == rep(c(0.5,3), length.out=nrow(df)),]
Run Code Online (Sandbox Code Playgroud)

要看到这一点,让我们看看如果使用向量会发生什么rep(0.5, 10):

rep(0.5, 10) == c(0.5, 3)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

看看它如何返回每个奇数值.基本上它与矢量匹配0.5c(0.5, 3, 0.5, 3, 0.5...)

您可以通过这种方式操纵矢量以不产生匹配.拿矢量rep(c(3, 0.5), 5):

rep(c(3, 0.5), 5) == c(0.5, 3)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

他们都是假的.您将每0.5与3匹配,反之亦然.

  • @user1320502 实际上,即使只有一个值,使用 %in% 也有一些优点。尝试 `x &lt;- c(1:5,rep(NA, 3)); x[x==3]` 并将其与 `x[x%in%3]` 进行比较。 (2认同)

NPE*_*NPE 12

df$time == c(0.5,3)
Run Code Online (Sandbox Code Playgroud)

c(0.5,3)一个广播到形状df$time,即c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3).然后逐个元素地比较两个矢量.

另一方面,

df$time %in% c(0.5,3)
Run Code Online (Sandbox Code Playgroud)

检查每个元素是否df$time属于该集合{0.5, 3}.


小智 9

这是一个旧线程,但我在任何地方都没有看到这个答案,它可能与某些人相关。

两者之间的另一个区别是 NA(缺失值)的处理。

NA == NA
[1] NA
NA %in% c(NA)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)