2013-03-12 4 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 %와`==`의 차이점

df$time == c(0.5,3) 

에서

+1

[비디오 번호 # 033] (http://www.twotorials.com/)에 관심이있을 수있는 R –

+1

에서 '?'== '및 %?'를 참조하십시오. –

답변

23

문제는 벡터 재활용입니다.

첫 줄은 예상했던대로 정확하게 작동합니다. df$time의 요소가 c(0.5, 3)에 있는지 확인하고 값을 반환합니다.

두 번째 줄이 더 까다 롭습니다.

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

이 모든 홀수 값을 반환하는 방법을 참조하십시오 : 그것은이 볼의가 벡터 rep(0.5, 10)를 사용하는 경우 어떻게되는지 볼 수 있도록

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

실제로 해당합니다. 본질적으로 벡터와 0.5가 일치합니다. 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

+0

@ user1320502 실제로 하나의 값을 가지고있을지라도 % in %를 사용하면 몇 가지 장점이 있습니다. 'x <- c (1 : 5, rep (NA, 3));를 시도해보십시오. x [x == 3]'과'x [x % in % 3] '을 비교합니다. –

8

는 제 c(0.5,3), 즉 c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3)df$time의 형상에 방송 얻는다. 그런 다음 두 벡터를 요소별로 비교합니다. df$time의 각 요소의 집합에 속하는지 여부 {0.5, 3} 한편

,

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

검사한다.