2013-03-12 235 views
15
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%==这里有什么区别?`%in%`和`==`之间的区别

+1

请参阅R' – 2013-03-12 09:56:35

+1

'中的'?'=='和'?'%你可能会对[视频编号#033]感兴趣(http://www.twotorials.com/) – 2013-03-12 13:24:19

回答

23

问题是矢量回收。

您的第一行完全符合您的期望。它检查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相匹配,反之亦然。

+0

使用'%in%'除非我比较一个唯一值或者实际上打算使用回收,非常清楚谢谢+ – user1320502 2013-03-12 10:13:36

+0

@ user1320502实际上,即使有一个值,使用%也有一些优点。尝试'x < - c(1:5,rep(NA,3)); x [x == 3]'并将其与'x [x%in%3]'进行比较。 – 2013-03-13 05:20:12

8

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}

相关问题