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匹配,反之亦然.
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)