Я хотел бы присоединиться к двум кадрам данных:
a <- data.frame(x=c(1,3,5))
b <- data.frame(start=c(0,4),end=c(2,6),y=c("a","b"))
с условием типа (x>start)&(x<end)
, чтобы получить такой результат:
# x y
#1 1 a
#2 2 <NA>
#3 3 b
Я не хочу делать потенциально большое декартово произведение, а затем выбирать только несколько строк, соответствующих условию, и мне нужно решение с использованием tidyverse (меня не интересует решение с использованием SQL, которое было бы признанием неудачи) . Я думал о пакете «fuzzyjoin», но не могу найти примеры, соответствующие моей потребности: функция, применяемая для условия, имеет только два аргумента. Я также попытался поместить «начало» и «конец» в один аргумент с помощью data.frame(z=I(purrr::map2(b$start,b$end,list)),y=b$y)
# z y
#1 0, 2 a
#2 4, 6 b
но хотя данные выглядят нормально, fuzzy_left_join их не принимает.
Я ищу решения, работающие в более общих случаях (n переменных в левой части, m в правой, не обязательно числовых с произвольными условиями).
ОБНОВЛЕНИЕ
Я также хочу иметь возможность выражать условия, такие как (x=start+1)|(x=end+1)
здесь:
# x y
#1 1 a
#2 3 a
#3 5 b