Dato un elenco a
contenenti vettori di lunghezza diversa e un vettore b
contenente alcuni elementi dai vettori in a
, voglio ottenere un vettore di lunghezza uguale a b
contenente l'indice in a
dove l'elemento in b
partite (questa è una cattiva spiegazione che conosco) ...modo veloce di ottenere indice della partita nella lista
il seguente codice fa il lavoro:
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
Sostituzione del sapply
con un ciclo for ottiene lo stesso di cours e
Il problema è che questo codice verrà utilizzato con elenchi e vettori con una lunghezza superiore a 1000. Su una vita reale impostata la funzione impiega circa 15 secondi (sia il ciclo for che lo sapply
).
Qualcuno ha un'idea di come accelerare, sicuro per un approccio parallelo? Non sono riuscito a vedere un approccio vettoriale (e non posso programmare in C, anche se probabilmente sarebbe il più veloce).
Edit:
limito a sottolineare elegante soluzione con la partita di Aaron(), che ha dato un aumento di velocità dell'ordine di 1667 volte (da 15 a 0.009)
ho ampliato un po 'su di esso per consentire a più partite (il ritorno è quindi un elenco)
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
il tempo di esecuzione per questo era 0,169, che è senza dubbio molto più lento, ma d'altra parte più flessibile
0.123.516,41 mila
Cosa si vuole che l'algoritmo faccia se un elemento di 'b' appare in più di un elemento di' a'? È possibile nel tuo problema attuale? –
Avrei dovuto specificare che ... Non è una possibilità – ThomasP85