2013-03-12 51 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 

Was ist der Unterschied zwischen %in% und == hier?Unterschied zwischen `% in%` und `==`

+1

Siehe '? '=='' und '? '% In%' in R –

+1

Sie könnten interessiert sein [video Nummer # 033] (http://www.twotorials.com/) –

Antwort

23

Das Problem ist Vektorrecycling.

Ihre erste Zeile macht genau das, was Sie erwarten würden. Es prüft, welche Elemente von df$time in c(0.5, 3) sind und gibt die Werte zurück, die sind.

Ihre zweite Zeile ist kniffliger. Es ist eigentlich äquivalent zu

df[df$time == rep(c(0.5,3), length.out=nrow(df)),] 

Um dies zu sehen, mal sehen, was passiert, wenn ein Vektor rep(0.5, 10) verwenden:

rep(0.5, 10) == c(0.5, 3) 
[1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE 

Sehen Sie, wie es jede ungerade Wert zurückgibt. Im Wesentlichen entspricht es 0,5 zum Vektor c(0.5, 3, 0.5, 3, 0.5...)

Sie können einen Vektor manipulieren, um auf diese Weise keine Übereinstimmungen zu erzeugen. Nehmen Sie den Vektor: 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 

Sie sind alle falsch. Sie stimmen alle 0,5 mit 3 und umgekehrt überein.

+0

bekommen es immer Verwenden Sie '% in%', es sei denn, ich vergleiche einen eindeutigen Wert ODER eigentlich beabsichtigen, Recycling zu verwenden, sehr klar danke + – user1320502

+0

@ user1320502 Tatsächlich gibt es einige Vorteile zu% in% verwenden, auch wenn Sie einen Wert haben. Versuchen Sie 'x <- c (1: 5, rep (NA, 3)); x [x == 3] 'und vergleiche das mit' x [x% in% 3] '. –

8

In

df$time == c(0.5,3) 

c(0.5,3) die erste an die Form des df$time ausgestrahlt wird, das heißt c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3). Dann werden die zwei Vektoren Element für Element verglichen.

Auf der anderen Seite,

df$time %in% c(0.5,3) 

prüft, ob jedes Element df$time{0.5, 3} zur Menge gehört.

Verwandte Themen