2012-04-02 4 views
6

R 목록이 주어지면 주어진 목록 항목의 색인을 찾고 싶습니다. 예를 들어, "36"항목의 경우, 출력을 "2"로 지정합니다. 또한 lapply를 사용하여 어떻게 이러한 쿼리를 병렬로 수행 할 수 있습니까?목록 항목의 색인 검색 R

리스트

$ 1 [1] "7", "12", "26", "29"

$ 2 [1] "11", "36"

$ 3 [1] "20" "49"

$ 4 [1] "39", "41"여기

+0

아마도'lapply (component_list, function (x) any (match (x, "36"))'와 비슷한 것이 당신을 가까이에 있습니다. –

+1

"36"은 두 번째 목록 요소이고 두 번째 요소는 두 번째 요소이기 때문에 예제가 모호합니다. –

답변

8

목록의 두 개 이상의 요소가 당신이 검색하는있는 문자열을 포함하는 (? 가능성) 가능성을 허용하는 한 줄의 :

## Some example data 
ll <- list(1:4, 5:6, 7:12, 1:12) 
ll <- lapply(ll, as.character) 

which(sapply(ll, FUN=function(X) "12" %in% X)) 
# [1] 3 4 
먼저 목록에 해당 인덱스에 값을 매핑하는 data.frame으로 목록을 돌 수 있었다
+1

정말 고마워! R은 처음에는 약간의 두통이 될 수 있습니다. – SAT

+0

@Josh : 당신의 예제는'[1] 3 4'을 반환하지 않아야합니까? –

+0

@ CarlWitthoft - 네, 고마워요. (나는 빠른 코드 편집을 일찍했지만 결과 비트를 변경하는 것을 간과했다.) 이제는 그것을 수정했다. 또한, 자신의 것과 같은 것을 자유롭게 편집 할 수 있습니다 (적어도 내 게시물 모두에서)! –

2

: 다음

ll <- list(c("7", "12", "26", "29"), 
      c("11", "36"), 
      c("20", "49"), 
      c("39", "41")) 

df <- data.frame(value = unlist(ll), 
       index = rep(seq_along(ll), lapply(ll, length))) 
df 
# value index 
# 1  7  1 
# 2  12  1 
# 3  26  1 
# 4  29  1 
# 5  11  2 
# 6  36  2 
# 7  20  3 
# 8  49  3 
# 9  39  4 
# 10 41  4 

는 첫 번째 발생의 인덱스를 찾는 match를 사용하여 함수를 작성 주어진 값의 관세, 보험료 : 당신은 match 때문에 한 번에 많은 단일 값에이 함수를 호출하거나 할 수

find.idx <- function(val)df$index[match(val, df$value)] 

는 벡터화 : 물론

find.idx("36") 
# [1] 2 
find.idx(c("36", "41", "99")) 
# [1] 2 4 NA 

, 당신은 또한 lapply을 통해 실행할 수 있습니다 특히 병렬로 실행하려는 경우 다음과 같이하십시오.

lapply(c("36", "41", "99"), find.idx) 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] NA 

이 마지막 비트를 병렬로 실행하려면 여러 가지 옵션이 있습니다. http://cran.r-project.org/web/views/HighPerformanceComputing.html을 통해 검색하여 옵션을 평가하는 것이 좋습니다.