2013-03-12 238 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}

相關問題