벡터에 주어진 요소가 포함되어 있는지 테스트


518

벡터에 주어진 값이 포함되어 있는지 확인하는 방법은 무엇입니까?


38
R 그냥 단어를 만들기 위해 포함되어 사용하지 않는 이유 때때로 나 자신에게 쉽게 사용자
— greg121

12
"in"은 "conta (in) s"에 포함되어 있다고 생각하십시오. 나는 "에"는 이러한 맥락에서 상당히 간결 경쟁자라고 주장 것
— hedgedandlevered

1
아마도 측면에 %표지판이 추가되어 있을 것입니다. 이 단어 in는 for-loop 구성에서 R로 사용되는 예약어입니다.
— IRTFM

@ greg121 dplyr 에는 이미 contains 함수가 있지만 데이터 프레임에서 열을 선택하는 다른 목적으로 사용됩니다. 예를 들면 select(iris, contains("etal")).
— Paul Rougieux

주어진 정밀도로 실제 가치가있는 숫자에 대해 간결한 방법이 있습니까?
— mlt

답변:


500

이를 위해 match()(첫 번째 모양을 반환) 및 %in%(부울을 반환) 기능이 모두 설계되었습니다.

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

첫 번째 모습뿐만 아니라 모든 모습을 얻는 것은 어떻습니까?
— StatsSorceress

어쩌면 조금 늦을지도 몰라 which(v, 'b'). 논증의 순서를 명심하십시오.
— Niklas Mertsch

귀하가 which(v, 'b')논리적 아닌 '어떤'을 인수 : 나에게 오류 메시지를 제공합니다 :> 오류가있는 (V, 'B')에서
— Capt.Krusty

176

is.element() 더 읽기 쉬운 코드를 만들고 %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE

6
나는 문서가 말한다 is.element(x, y) is identical to x %in% y. 왜, 나는 잘 모릅니다 is.elements정수와 숫자를 혼합 할 때 작동 %in%하지 않습니다
— pomber

@pomber : 이것의 예를 들어 주시겠습니까?
— discipulus

@pomber는 고정되어 있습니까?
— vasili111

2
뛰어난 가독성 is.element()대 %in%주관적입니다. 인수 순서에 따라 모호성을 제거하므로 삽입 연산자가 더 읽기 쉽습니다. apple in fruit말이 fruit in apple되지 않습니다. is.element(apple, fruit)또는 함수의 is.element(fruit, apple)구현에 따라 둘 다 맞을 수 있습니다 is.element.
— rileymcdowell

70

출력을 기준으로 옵션을 그룹화합니다. 모든 예제에 대해 다음 벡터를 가정하십시오.

v <- c('z', 'a','b','a','e')

존재 여부 확인 :

%에%

> 'a' %in% v
[1] TRUE

어떤()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

첫 번째 발생을 찾기 위해 :

시합()

> match('a', v)
[1] 2

모든 벡터를 지수 벡터로 찾기 :

어느()

> which('a' == v)
[1] 2 4

모든 발생을 논리 벡터로 찾기 위해 :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

편집 : 주석에 언급 된 이유로 목록에서 grep () 및 grepl () 제거


6
here 와 here에 이미 언급했듯이 grep()정확한 일치를 찾기 위해 정규 표현식을 사용하지 마십시오 .
— Uwe

69

어떤 () 가 읽을 수있는 코드에 대한 함수 만든다

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE

9
이 다르게 행동주의 %in%: any(1==NA)반환 NA, 1 %in% NA반환 FALSE.

@ user3603486 :을 any(1==NA, na.rm=TRUE)반환합니다 FALSE.
— AkselA

36

%in%연산자 를 사용할 수 있습니다 :

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

또한 "어떤"요소의 위치를 ​​찾기 위해

pop <- c(3,4,5,7,13)

which(pop==13)

대상 벡터에 포함되지 않은 요소를 찾으려면 다음을 수행하십시오.

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]

which실제로는 그렇지 않은 경우와 달리 모든 일치하는 위치를 배열로 제공하기 때문에 때때로 바람직합니다 match. stackoverflow.com/questions/1169388/…
— Fizz

2
에 which없는 요소를 찾으려면 왜 귀찮게 Tset합니까? pop직접 색인을 생성 할 수 있습니다 . pop[!pop%in%Tset]
— Houshalter

13

나는이 목적을 위해 grep ()과 grepl ()을 정말로 좋아합니다.

grep ()은 일치하는 위치를 나타내는 정수 벡터를 반환합니다.

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl ()은 일치하는 위치에 "TRUE"인 논리 형 벡터를 반환합니다.

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

이 기능은 대소 문자를 구분합니다.


10
기본적 grep으로 정규 표현식을 첫 번째 요소로 "b"사용 하여 ,에 대한 정확한 일치를 수행하십시오 ( use ^e$또는 add , fixed=TRUE).
— reinierpost

10
정확히 일치하는 정규 표현식을 사용하지 마십시오. 이것은 위험하고 예기치 않은 결과를 가질 수 있습니다
— 데이비드 Arenburg

9
예, 이것은 끔찍하고 좋지 않으며 매우 나쁜 생각입니다-비효율적이며 깨질 것입니다. 예를 들어 'b'가 아닌 경우에도 myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)반환 TRUE됩니다 myvar.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.