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

时间:2013-03-12 09:54:05

标签: 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

%in%==之间的区别是什么?

2 个答案:

答案 0 :(得分:26)

问题是矢量回收。

你的第一行完全符合你的期望。它会检查df$timec(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

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

匹配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

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

答案 1 :(得分:11)

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}