`%in%`和`==`有什么区别?

33
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%==有什么区别?


2
在R中,参考?'=='?'%in%' - CHP
2
你可能会对视频编号#033感兴趣。 - Anthony Damico
3个回答

33

问题是向量循环利用。

你的第一行代码做了你预期的事情。它检查 df$time 中哪些元素在 c(0.5, 3) 中,并返回这些值。

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

df[df$time == rep(c(0.5,3), length.out=nrow(df)),]
为了看清这一点,让我们看一下如果使用向量 rep(0.5, 10) 会发生什么:
rep(0.5, 10) == c(0.5, 3)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

看看它是如何返回每一个奇数值的。基本上它是将0.5与向量c(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匹配,反之亦然。


1
除非我正在比较一个唯一的值或者有意使用循环,否则请始终使用%in%。非常清晰,谢谢。 - user1320502
2
@user1320502 其实,即使只有一个值,使用%in%也有一些优势。尝试 x <- c(1:5, rep(NA, 3)); x[x==3] 并将其与 x[x%in%3] 进行比较。 - sebastian-c

15

需要翻译的内容为“

In

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}


8

这是一个旧帖子,但我没有在任何地方看到这个答案,对于某些人可能会很有用。

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

NA == NA
[1] NA
NA %in% c(NA)
[1] TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接