Редактировать после предоставления данных:
Получение определения данных из сообщения @ MKR:
library(fuzzyjoin)
fuzzy_left_join(Table_1, Table_2,match_fun = function(x,y) y> x & y<=1.1*x )
# Joining by: "x"
# x.x y x.y z
# 1 1 25 1.10 30
# 2 2 26 2.05 35
# 3 3 27 NA NA
общие пояснения с поддельными данными (первый ответ)
поддельные данные
iris1 <- head(iris[1:2])
iris1
# Sepal.Length Sepal.Width
# 1 5.1 3.5
# 2 4.9 3.0
# 3 4.7 3.2
# 4 4.6 3.1
# 5 5.0 3.6
# 6 5.4 3.9
iris2 <- head(iris[c(1,3)])
set.seed(1)
# add noise
iris2$Sepal.Length <- iris2$Sepal.Length + rnorm(6,sd=0.05)
# shuffle rows
iris2 <- iris2[sample(seq(nrow(iris2))),]
iris2
# Sepal.Length Petal.Length
# 5 5.016475 1.4
# 2 4.909182 1.4
# 4 4.679764 1.5
# 6 5.358977 1.7
# 3 4.658219 1.3
# 1 5.068677 1.4
код
library(fuzzyjoin)
fuzzy_left_join(iris1,iris2,match_fun= function(x,y) y>0.99*x & y<1.01*x )
# Joining by: "Sepal.Length"
# Sepal.Length.x Sepal.Width Sepal.Length.y Petal.Length
# 1 5.1 3.5 5.068677 1.4
# 2 4.9 3.0 4.909182 1.4
# 3 4.7 3.2 4.679764 1.5
# 4 4.7 3.2 4.658219 1.3
# 5 4.6 3.1 NA NA
# 6 5.0 3.6 5.016475 1.4
# 7 5.4 3.9 5.358977 1.7
Мы видим, что некоторые строкиочень хорошо соответствует, давайте посмотрим на исключения.В строке № 4 добавлено слишком много шума в iris2
, поэтому он был соединен со строкой 3, в которой есть 2 совпадения.Когда я выбрал левое соединение, строка 4 по-прежнему отображается, но с NAs
для столбцов iris2
.
Насколько я понимаю:
- Присоединяющиеся столбцы будутбыть расширенным
- Функция принимает эти длинные столбцы (
6*6==36
элементы здесь) в качестве аргументов - Мы применяем векторизованные функции (например,
<
или &
в данном случае) для возвратавектор логики, который будет фильтровать эти длинные столбцы для построения выходных данных data.frame
.
distance_left_join
более прост в использовании, но тогда это абсолютное расстояние, а не относительное.