2012-04-02 23 views
6

Dada una lista R, deseo encontrar el índice de una entrada dada en la lista. Por ejemplo, para la entrada "36", quiero que mi salida sea "2". Además, ¿cómo podría hacer esas consultas en paralelo utilizando lapply?Buscar el índice de una entrada de lista en R

lista

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

$ 2 [1] "11" "36"

$ 3 [1] "20" "49"

$ 4 [1] "39" "41"

+0

Tal vez algo como 'lapply (component_list, function (x) any (match (x," 36 ")))' te acerca. –

+1

Su ejemplo es ambiguo porque "36" es el segundo elemento de la lista y el segundo elemento en el segundo elemento de la lista. –

Respuesta

8

Aquí hay una sola línea que permite la posibilidad (probabilidad?) Que más de un elemento de la lista contendrá la cadena para la que está buscando:

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

¡Muchas gracias! R puede ser un poco dolor de cabeza al principio. – SAT

+0

@Josh: ¿su ejemplo no debería devolver '[1] 3 4'? –

+0

@CarlWitthoft - Sí, gracias. (Hice una edición rápida del código desde el principio, pero al parecer descuidé cambiar el bit de resultados). Se ha solucionado ahora. Además, siéntete libre de editar cosas así por ti mismo (al menos en cualquiera de mis publicaciones). –

2

Se podría dar vuelta a su primera lista en un hoja.de.datos que asigna valores a su índice correspondiente en la 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 

Luego, escribe una función utilizando match para encontrar el índice del primer producirse rencia de un valor dado:

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

Usted puede llamar a esta función en un solo valor, o muchas a la vez desde match se vectorizado:

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

Por supuesto, también se puede ejecutar a través de lapply , sobre todo si va a ejecutar en paralelo:

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

para la ejecución de este último bit en paralelo, hay muchas, muchas opciones. Le recomendaría que sopese sus opciones buscando en http://cran.r-project.org/web/views/HighPerformanceComputing.html.

Cuestiones relacionadas