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%
和==
之间的区别是什么?
答案 0 :(得分:26)
问题是矢量回收。
你的第一行完全符合你的期望。它会检查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
看看它如何返回每个奇数值。基本上它与向量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
他们都是假的。您将每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}
。