28
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

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

4

3 回答 3

29

问题是矢量回收。

您的第一行完全符合您的预期。它检查其中的元素df$timec(0.5, 3)返回其中的值。

你的第二行更棘手。它实际上相当于

df[df$time == rep(c(0.5,3), length.out=nrow(df)),]

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

rep(0.5, 10) == c(0.5, 3)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

看看它是如何返回每个奇数的。本质上它与向量匹配 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

他们都是FALSE;您将每 0.5 与 3 匹配,反之亦然。

于 2013-03-12T10:01:52.990 回答
14

df$time == c(0.5,3)

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)

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

于 2013-03-12T10:01:36.167 回答
6

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

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

NA == NA
[1] NA
NA %in% c(NA)
[1] TRUE
于 2019-03-12T16:37:58.197 回答