Дан список 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, что, возможно, довольно медленно, но, с другой стороны, более гибко