Я хотел бы объединить два фрейма данных в нескольких диапазонах. Ниже я привел представительный пример. Решение sqldf работает, однако мне интересно, есть ли лучший способ сделать это (например, используя data.table).
base <- data.frame(lower1 = c(12, 12, 3, 2), upper1 = c(20, 20, 20, 4),
lower2 = c(12, 12, 3, 2), upper2 = c(20, 20, 20, 4)) %>%
data.table()
more_info <- data.frame(color = 'red', value1 = 4, value2 = 4, thing1 = 5, thing2 = 5) %>%
data.table()
setkey(base, lower1, upper1, lower2, upper2)
setkey(more_info, value1, value2, thing1, thing2)
# works
sqldf('select * from base left join more_info
on ( base.lower1 <= more_info.value1 and base.upper1 >= more_info.value1
and base.lower2 <= more_info.thing1 and base.upper2 >= more_info.thing1)')
# doesn't work but is what i would like to do
setkey(base, lower1, upper1, lower2, upper2)
setkey(more_info, value1, value2, thing1, thing2)
foverlaps(more_info, base, by.x = key(more_info), by.y = key(base), type = 'within',
mult = 'all', nomatch = NA)
В качестве фона, у меня есть алгоритм сопоставления, для которого мне нужно улучшить время выполнения. Алгоритм сопоставления работает путем фильтрации большого количества ссуд на основе определенных характеристик для меньшего числа потенциальных совпадений. Затем я применяю любые дополнительные статистические методы, необходимые для нахождения наилучшего соответствия. Задержка многократно фильтрует большой набор данных всех совпадений до меньшего числа потенциальных совпадений. Моя цель - найти более быстрый способ создания фрейма данных потенциальных совпадений, а затем использовать групповые и другие векторизованные функции для завершения процесса сопоставления.