Быстрый способ получить индекс совпадения в списке

Дан список a, содержащий векторы неравной длины, и вектор b, содержащий некоторые элементы из векторов в a, я хочу получить вектор равной длины с b, содержащий индекс в a, где элемент в bсоответствует (это плохое объяснение, которое я знаю)...

Следующий код выполняет эту работу:

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

Замена sapplyциклом for, конечно же, дает то же самое

Проблема в том, что этот код будет использоваться со списками и векторами длиной более 1000.В реальной жизни функция занимает около 15 секунд (как цикл for, так и sapply).

Кто-нибудь знает, как ускорить это, безопасно для параллельного подхода? Мне не удалось увидеть векторизованный подход (и я не могу программировать на C, хотя это, вероятно, было бы самым быстрым).

Редактировать:

Просто подчеркну элегантное решение Аарона с использованием match(), которое дало увеличение скорости порядка 1667 раз (с 15 до 0,009)

Я немного расширил его, чтобы разрешить множественные совпадения ( return - это список)

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

Время выполнения для этого было 0,169, что, возможно, довольно медленно, но, с другой стороны, более гибко

15
задан ThomasP85 12 June 2012 в 21:32
поделиться