Dada una lista a
que contienen vectores de longitud desigual y un vector b
que contiene algunos elementos de los vectores en a
, quiero obtener un vector de longitud igual a b
que contiene el índice de a
donde el elemento de b
partidos (esto es una mala explicación que conozco) ...Una manera rápida de conseguir el índice de coincidencia en la lista
el siguiente código hace el trabajo:
a <- list(1:3, 4:5, 6:9)
b <- c(2, 3, 5, 8)
sapply(b, function(x, list) which(unlist(lapply(list, function(y, z) z %in% y, z=x))), list=a)
[1] 1 1 2 3
Sustitución de la sapply
con un bucle for logra el mismo de cours e
El problema es que este código se usará con listas y vectores con una longitud superior a 1000. En un conjunto de la vida real, la función tarda unos 15 segundos (tanto para el ciclo como sapply
).
¿Alguien tiene una idea de cómo acelerar esto, seguro para un enfoque paralelo? No he podido ver un enfoque vectorizado (y no puedo programar en C, aunque probablemente sea el más rápido).
Editar:
limitaremos a destacar elegante solución utilizando partido de Aaron(), que dio un aumento de la velocidad del orden de 1667 veces (de 15 a 0.009)
amplié un poco en él para permitir que varios partidos (el retorno es entonces una lista)
a <- list(1:3, 3:5, 3:7)
b <- c(3, 5)
g <- rep(seq_along(a), sapply(a, length))
sapply(b, function(x) g[which(unlist(a) %in% x)])
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3
el tiempo de ejecución para este era 0.169 que es posiblemente bastante más lento, pero por otro lado más flexible
¿Qué quiere que haga el algoritmo si un elemento de 'b' aparece en más de un elemento de' a'? ¿Es eso posible en tu problema real? –
Debería haber especificado que ... No es una posibilidad – ThomasP85