Я пытаюсь посмотреть значение из заданной таблицы поиска (lk_tbl) с использованием, из-за отсутствия лучшего слова, нечеткие соответствия, такие как следующие:Как ускорить сопоставление нечетких индексов в R (потенциально используя Rcpp)?
lk_tbl <- structure(list(num = c(1, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35,
1.4), val = c(0.241970724519143, 0.229882140684233, 0.217852177032551,
0.205936268719975, 0.194186054983213, 0.182649085389022, 0.171368592047807,
0.16038332734192, 0.149727465635745)), .Names = c("num", "val"
), row.names = c(NA, -9L), class = "data.frame")
> lk_tbl
num val
1 1.00 0.2419707
2 1.05 0.2298821
3 1.10 0.2178522
4 1.15 0.2059363
5 1.20 0.1941861
6 1.25 0.1826491
7 1.30 0.1713686
8 1.35 0.1603833
9 1.40 0.1497275
В основном, пары таблиц числа и его связанное значение. Теперь, если я хочу найти значение, связанное с номером 1.22
, которого нет в lk_tbl, я хочу сделать некоторую интерполяцию.
fuzzy_lkup<- function(x) {
matched_num <- lk_tbl %>%
filter(num==x) # check for exact val
if(nrow(matched_num) == 1) { # if the exact match exists
return(matched_num$val)
}
else {
return(lk_tbl %>%
filter(x < num + 0.05, x > num -0.05) %>%
.[["val"]] %>%
mean())
}
}
> fuzzy_lkup(1) # it returns the matched value
[1] 0.2419707
> fuzzy_lkup(1.22) # it does the interpolation
[1] 0.1884176
# for the vector, I can use vapply like this.
> vapply(c(1.22, 1.18, 1.24), fuzzy_lkup,numeric(1))
[1] 0.1884176 0.2000612 0.1884176
В конечном счете, я хочу сделать это для длинного вектора из огромной таблицы поиска.
Теперь то, что я наблюдал этот процесс prohibitly медленный для большой таблицы поиска Так что мой вопрос
- Как бы вы ускорить это? (vectorize this function?)
- Как бы вы решили это с помощью Rcpp? Является ли Rcpp правильным инструментом для этого? как вы импортируете таблицу поиска, какую структуру данных вы бы использовали для ее решения, и в конечном итоге, как вы решаете эту проблему?