2017-09-05 3 views
3

%in%의 이해에 어려움이 있습니다. 해들리 위컴 (Hadley Wickham)의 "R for data science"에서 5.2.2 절에서 "이 문제에 대한 유용한 단서는 x %in% y이다. 그러면 x가 y의 값 중 하나 인 모든 행이 선택 될 것이다." 다음이 예 주어진다 : I 구문 보면% in % 이해의 트러블

nov_dec <- filter(flights, month %in% c(11, 12)) 

단, I는, y는 X의 값 중 하나의 모든 행을 선택해야 함을 표시하는 모든 예제 너무 (?) 11과 12 (y)가 "달"(x)에 나타나는 경우.

?"%in%"이 내용이 더 명확하지 않습니다. 분명히 나는 ​​뭔가를 놓치고 있지만 누군가가이 함수가 어떻게 작동하는지 정확히 설명 할 수 있을까요?

+4

나는 "x is in y"로 '% y %'를 읽는 경향이있다. '% in % '연산자는'match'의 유용한 래퍼입니다. 여기서 y는'match'에 대한 "table"인수입니다. 즉, y는 비교에 사용되는 값들의 집합입니다. '% in % '연산자는 x의 원소가 y 인 경우 TRUE를 가진 x의 길이를 논리 벡터로 반환합니다. 비슷하게'match'는 x의 inteder vector를 테이블의 y의 위치 (인덱스)와 함께 반환합니다. – lmo

+0

SQL에 익숙하다면 SQL 문과 동일합니다. 'select * from flights where month in (11, 12)'. –

+0

@lmo 혼란스러운 점이라고 생각합니다. 많은 가치를 지닌 벡터가 2 개의 값을 갖는 벡터에 "in"될 수 있다는 것은 직관이 다릅니다."x의 원소가 y"인 것을 읽으면 x의 모든 원소가 y에 포함될 필요가 없다는 것을 조금 더 쉽게 이해할 수 있습니다. – Caleb

답변

7

그것의 y 값 중 하나 인 모든 행을 선택해야한다고 표시하십시오 exemple 또한 Y 이해하는 최선의 방법으로 X로부터 값이다 in x (?) 예에서 11과 12가 "월"에 나타나는 모든 경우입니다.

예제를 보면 동작을 이해할 수 없다면 직접 시도해보십시오. 예를 들어, 당신이 할 수 있습니다 :

> c(1,2,3) %in% c(2,4,6) 
[1] FALSE TRUE FALSE 

는 그래서 %in% 당신에게 첫 번째 인수 ( %in% 전에 하나)의 각 항목에 해당 TRUEFALSE 값의 벡터를 제공 보인다. 의 다른 해보자 :

을 확인
> c(1,2,3) %in% c(2,4,6,8,10,12,1) 
[1] TRUE TRUE FALSE 

: 첫 번째 인수의 첫 번째 항목은 등 어느 곳에서나 두 번째 인수에 발견하고 경우 반환 된 벡터의 첫 번째 항목이 TRUE입니다. 당신이 match()를 사용하여 얻을 하나에 그 결과를 비교 :

> match(c(1,2,3), c(2,4,6,8,10,12,1)) 
[1] 7 1 NA 

그래서 match()%in%의 차이는 전자가 첫 번째 인수 당신에게 각 항목에 대한 첫 경기의 두 번째 인수의 실제 위치를 준다이다, %in%은 첫 번째 인수의 각 항목이 두 번째 인수에 나타나는지 여부를 알려주는 논리 벡터를 제공합니다.

위캄 (Wickham)의 책 예와 관련하여 month은 다양한 비행이 이루어지는 달을 나타내는 값의 벡터입니다. 그래서 같은 인수를 위해서, 무엇인가 : 당신이 질문 에 대한 답변에 그 벡터를 설정 할 수있는 %in% 연산자를 사용

> month <- c(2,3,5,11,2,9,12,10,9,12,8,11,3) 

개월 11 또는 12이 비행인가? 이 같은 : 당신에게 즉 참/거짓 값 목록 논리적 벡터를 제공

> month %in% c(11,12) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE 
[13] FALSE 

. filter() 함수는 해당 논리 벡터를 사용하여 flights 테이블에서 해당 행을 선택합니다. 함께 사용하면 filter%in%은 질문에 답변합니다 11 개월 또는 12 개월 이내에 발생하는 모든 항공편은 무엇입니까?

당신은 주위 %in%을 설정하는 대신이 요청하는 경우 :

> c(11,12) %in% month 
[1] TRUE TRUE 

당신이 정말 달 11 월 (12)의 각각의 모든 항공편을 이 있습니까 요구하는지?

큰 벡터가 두 개의 값만있는 벡터에 있는지 여부를 묻는 것이 이상하게 보일 수도 있습니다. x %in% y으로 읽는 것을 고려하십시오. 각각 x의 값은 y입니까?

+1

정말 완벽한 설명을 해주셔서 감사합니다. 이제 이해가된다! –

0

이 명시 수단 :

x <- 1:10 # numbers from 1 to 10 
y <- (1:5)*2 # pair numbers between 2 and 10 

y %in% x # all pair numbers between 2 and 10 are in numbers from 1 to 10 

x %in% y #only pair numbers are return as True 
2

빠른 운동 기능의 작동 방식을 보여주기 위해 충분해야한다 :

> x <- c(1, 2, 3, 4) 
> y <- 4 
> z <- 5 

> x %in% y 
[1] FALSE FALSE FALSE TRUE 

그래서 숫자 벡터 x의 네 번째 요소는 숫자 벡터 y에 존재한다.

> y %in% x 
[1] TRUE 

그리고 y의 첫 번째 요소는 (하나있다)는 x입니다.

> z %in% x 
[1] FALSE 
> x %in% z 
[1] FALSE FALSE FALSE FALSE 

그리고 어느 zx에도 x의는 z입니다.

또한 ?match

1

와 일치하는 모든 기능에 대한 도움말을 참조하십시오 내가 어떻게 작동하는지 이해하는 것은 다소 의미이고, 당신이 말할 수있는 일단 논리적으로 다음 문법 자체를 작동 생각합니다.

핵심은 코드를 읽을 때마다 각 행을 따라 작업 할 때 apply의 컨텍스트를 포함하고 부울 로직은 포함 된 내용에 따라 행을 포함 또는 제외합니다. "목록별로 필터링"%in% c(). 그 위의 예를 들어이 경우

nov_dec <- filter(flights, month %in% c(11, 12)) 

이렇게 읽어야

"로 설정된 변수 (해당 행)에서 가변 열 month가되어 flights, 행의 서브 세트와 동일 nov_dec 목록 c(11,12). "위로부터 r 작품으로

는 아래로는 한 달에 외모와 그 중 하나 11 또는 12, 목록에서 두 변수의 경우, 다음은 nov_dec에 OTH 그들을 포함 어쨌든 계속됩니다.