2012-04-02 8 views
6

Dato un elenco R, desidero trovare l'indice di una voce di elenco data. Ad esempio, per la voce "36", voglio che il mio output sia "2". Inoltre, come potrei fare queste domande in parallelo usando lapply?Ricerca per l'indice di una voce di elenco in R

lista

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

$ 2 [1] "11" "36"

$ 3 [1] "20" "49"

$ 4 [1] "39" "41"

+0

Forse qualcosa come 'lapply (component_list, function (x) any (match (x," 36 "))) ti avvicina. –

+1

L'esempio è ambiguo perché "36" è il secondo elemento dell'elenco e il secondo elemento nel secondo elemento dell'elenco. –

risposta

8

Ecco una battuta che prevede la possibilità (probabile?) Che più di un elemento della lista conterrà la stringa per il quale si sta cercando:

## 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 
+1

Grazie mille! R può essere un po 'un mal di testa all'inizio. – SAT

+0

@Josh: il tuo esempio non dovrebbe restituire '[1] 3 4'? –

+0

@CarlWitthoft - Sì, grazie. (Ho fatto una modifica rapida del codice all'inizio ma apparentemente ho dimenticato di cambiare il bit dei risultati.) Risolto il problema ora. Inoltre, sentiti libero di modificare cose del genere (almeno in nessuno dei miei post)! –

2

Si potrebbe innanzitutto attivare la vostra lista in un data.frame che mappa i valori al loro indice corrispondente nella lista:

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 

Poi, scrivere una funzione utilizzando match per trovare l'indice del primo verificarsi rimento di un dato valore:

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

È possibile chiamare questa funzione su un singolo valore, o molti in un momento dato match è vettorializzare:

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

Naturalmente, è anche possibile eseguirlo tramite lapply , soprattutto se si prevede di eseguire in parallelo:

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

per l'esecuzione di questo ultimo bit in parallelo, ci sono molte, molte opzioni. Ti consiglio di valutare le opzioni cercando attraverso http://cran.r-project.org/web/views/HighPerformanceComputing.html.

Problemi correlati