벡터에서 요소의 인덱스를 찾기위한 R 함수가 있습니까?


324

R에는 요소 x와 벡터가 v있습니다. 나는에 요소의 첫 번째 인덱스를 찾으려면 v그와 같다 x. 이 작업을 수행하는 한 가지 방법은 다음 which(x == v)[[1]]과 같습니다 . , 그러나 그것은 너무 비효율적입니다. 더 직접적인 방법이 있습니까?

보너스 포인트의 경우 x벡터 인 경우 작동하는 함수가 있습니까? 즉, 그것은 각각의 요소의 위치를 나타내는 지표 벡터 돌려 x하여 v.


R은 벡터와 함께 작동하도록 최적화 which(x == v)[[1]]되었으므로 그다지 비효율적이지는 않습니다. ==모든 벡터 요소에 적용되는 하나의 비교 연산자 ( )와 인덱스 ( which) 에 대한 하나의 하위 설정 입니다. 그게 다야. 이 기능에 대해 10.000 반복을 실행하지 않는 한 관련성이 없습니다. 다른 솔루션 좋아 match하고 Position많은 데이터로 반환하지 않을 수 있습니다 which,하지만 그들은 반드시 더 효율적 아니에요.
BurninLeo

2
내 질문은 x보다 벡터화 된 함수를 선호한다고 지정했지만 which(x == v)[[1]]그렇지 않습니다.
Ryan C. Thompson

답변:


461

이 함수 match는 벡터에서 작동합니다.

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

match요청한대로 첫 번째 일치 항목 만 반환합니다. 첫 번째 인수 값의 두 번째 인수 위치를 리턴합니다.

여러 개의 일치 %in%하는 방법은 다음과 같습니다.

x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1]  2  5  9 10

%in%첫 번째 인수만큼 논리 벡터를 반환하며 TRUE, 두 번째 인수에서 if 값을 찾을 수 있고 FALSE그렇지 않은 경우 값을 반환합니다.


필자와 % in %가 모두 c (2,3,3) 및 c (1,2,3,4) 인 예제는 예제 간의 변경이 적을수록 더 유익 할 것이라고 생각합니다. match (c (2,3,3), c (1 : 4))는 더 긴 첫 번째 벡터를 필요로하지 않고 다음과 같은 다른 결과를 반환합니다 (c (2,3,3) % in % c (1 : 4)). 예에서 예로의 많은 변화. 또한 일치하지 않는 것을 매우 다르게 처리한다는 점도 주목할 가치가 있습니다.
John

1
@ 존 : 그것은 사실이지만 OP가 요구 한 것이 아닙니다. OP는 긴 벡터에서 시작하여 다른 요소에서 주어진 첫 번째 요소를 찾도록 요청했습니다. 그리고 완전성을 기하기 위해 모든 지수에 관심이 있다면 which (% in %)를 사용해야한다고 덧붙였습니다. BTW, 답변을 삭제할 이유가 없습니다. 유효한 정보입니다.
Joris Meys

1
match첫 번째 색인을 원한다면 인수의 순서가 중요 하다는 것을 강조하는 것이 도움이 될 것이라고 생각합니다 . 예를 들어, match(x,c(4,8))처음에는 분명하지 않은 다른 결과를 제공합니다.
apitsch

@goldenoslik의 도움말 페이지를 읽으면 도움이 match됩니다. 모두 거기에 설명되어 있습니다. 그러나 나는 그 정보를 추가했습니다.
Joris Meys

감사! 이 솔루션은 내 하루를 구했습니다!
진화 왕

26

Positionfunprog {base} 의 함수 도 작업을 수행합니다. 임의의 함수를 전달하고 첫 번째 또는 마지막 일치를 반환합니다.

Position(f, x, right = FALSE, nomatch = NA_integer)


10

위에서 언급 한 방법의 효율성에 대한 작은 참고 사항 :

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100

가장 좋은 것은

    which("Feb" == month.abb)[[1]]

벤치 마크는 길이 12 벡터를 기반으로하므로 의미가 없습니다. 또한 귀하의 예 which("Feb" == month.abb)에서 2– 왜 [[1]]?
markus

@markus이 코드 which ( "Feb"== month.abb) [[1]]은 "2"를 반환하고이 코드는 (month.abb % in % "Feb")는 "2"를 반환합니다. 또한 왜 벡터를 사용하는 것이 의미가 없는지 명확하지 않습니다
Andrii

1
벡터에 관한 것이 아니라 길이에 관한 것입니다. 적절한 길이의 벡터를 생성 한 다음이를 기반으로 벤치 마크를 수행해야합니다. OPs 질문에 인용하면 "이 작업을 수행하는 한 가지 방법은 다음 which(x == v)[[1]]같습니다.
markus

-5

R은 ==벡터 건초 더미에서 바늘의 인덱스를 찾는 방법으로 double equals 연산자를 오버로드했습니다 . 건초 더미의 각 일치 값을 logical포함 하는 벡터를 생성합니다 TRUE.

예:

haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3  5
haystack[indices]
[1] 4  4

둘 다 벡터 인 경우 작동하며 여러 벡터를 사용하도록 확장 할 수도 있습니다.


2
==연산자는 이미 바늘의 벡터 작동하지 않는 비효율적 인 솔루션으로 내 질문에 언급했다.
Ryan C. Thompson

"둘 다 벡터 인 경우 작동합니다."아마도 의미하는 바에 따라 ... OP가 원한다는 의미가 아닙니다.
Frank

30
내가 얻을 FALSE FALSE TRUE FALSE TRUE대신이 예에서는 인덱스의
Sashko Lykhenko

6
R에서는 이것을 실행 ==하지 않았습니다. 인덱스가 아닌 논리 형 벡터를 반환합니다. which()7 년 전에 설명한 것처럼이를 위해을 ( 를) 필요 로합니다.
Joris Meys
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.