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

Qual è la differenza tra %in% e == qui?Differenza tra `% in%` e `` ==

+1

Vedere '? '=='' e '? '% In%'' in R –

+1

potresti essere interessato a [numero video 033] (http://www.twotorials.com/) –

risposta

23

Il problema è il riciclo vettoriale.

La prima linea fa esattamente quello che ti aspetteresti. Controlla quali elementi di df$time sono in c(0.5, 3) e restituisce i valori che sono.

La seconda linea è più complicata. In realtà è equivalente a

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

Per vedere questo, vediamo cosa succede se utilizzare un vettore rep(0.5, 10):

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

vedere come si torna ogni valore dispari. Essenzialmente corrisponde allo 0,5 sul vettore c(0.5, 3, 0.5, 3, 0.5...)

È possibile manipolare un vettore per non produrre corrispondenze in questo modo. Prendere il vettore: 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 

Sono tutti FALSE. Stai abbinando ogni 0,5 con 3 e viceversa.

+0

scaricarlo sempre usa '% in%' a meno che non stia confrontando un valore univoco O che intendo davvero usare il riciclo, grazie molto chiaro + – user1320502

+0

@ user1320502 In realtà, ci sono alcuni vantaggi nell'usare% in% anche quando hai un valore. Prova 'x <- c (1: 5, rep (NA, 3)); x [x == 3] 'e confrontalo con' x [x% in% 3] '. –

8

In

df$time == c(0.5,3) 

il primo c(0.5,3) ottiene trasmesso alla forma di df$time, cioè c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3). Quindi i due vettori vengono confrontati elemento per elemento.

D'altra parte,

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

verifica se ogni elemento di df$time appartiene al set {0.5, 3}.