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


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
herehere에 이미 언급했듯이 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.