Здесь используется fuzzyjoin::fuzzy_inner_join
. Как я понимаю из ваших выходных данных, помимо критериев для from =< number <= to
, вы хотели бы присоединиться по code1
и code2
.
- Присоединиться к
code1
и code2
по равенству - Присоедините
from
к number
по первому неравенству, т.е. from <= number
- Присоедините
to
к number
по второму неравенству, то есть number <= to
Особенность fuzzy_join
заключается в том, что они выводят все столбцы в обоих фреймах данных.
-
library(fuzzyjoin)
fuzzy_inner_join(
df_A, df_B,
by = c(
"code1" = "code1",
"code2" = "code2",
"from" = "number",
"to" = "number"),
match_fun = c(
"code1" = function(l, r) l == r,
"code2" = function(l, r) l == r,
"from" = function(l, r) l <= r,
"to" = function(l, r) r <= l))
# code1.x code2.x element1 from to code1.y code2.y element2 number
# 1 c1a c2a e1a 1 15 c1a c2a e2a 7
# 2 c1a c2a e1a 1 15 c1a c2a e2b 10
# 3 c1a c2a e1b 17 50 c1a c2a e2c 35
данные
df_A <- structure(list(code1 = c("c1a", "c1a", "c1a", "c1b", "c1b"),
code2 = c("c2a", "c2a", "c2b", "c2c", "c2d"), element1 = c("e1a",
"e1b", "e1c", "e1d", "e1e"), from = c(1L, 17L, 14L, 1L, 40L
), to = c(15L, 50L, 67L, 20L, 60L)), class = "data.frame", row.names = c(NA, -5L))
df_B <- structure(list(code1 = c("c1a", "c1a", "c1a"), code2 = c("c2a",
"c2a", "c2a"), element2 = c("e2a", "e2b", "e2c"), number = c(7L,
10L, 35L)), class = "data.frame", row.names = c(NA, -3L))