Я хотел бы объединить два фрейма данных:
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', но не могу найти примеры, которые бы соответствовали моим потребностям: функция для применения условия имеет только два аргумента.Я также попытался поместить 'start' и 'end' в один аргумент с 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 переменных на LHS, m на RHS, необязательно числовые с произвольными условиями).
ОБНОВЛЕНИЕ
Я также хочу иметь возможностьвыразить условия, такие как (x=start+1)|(x=end+1)
здесь:
# x y
#1 1 a
#2 3 a
#3 5 b