У меня есть два набора данных A
и B
, и для каждого наблюдения в A
я хочу вычислить расстояние distance
(например, евклидово расстояние, расстояние L1 или что-то еще) для каждого наблюдения в B
(расчет расстояния основан на переменных в наборах данных).Наблюдение из A
следует затем связать с наблюдением в B
, для которого это расстояние минимально.
Например, если A
имеет 5000 наблюдений, а B
имеет 10000 наблюдений, то
for(i in 1:5000)
{
x = data.frame(x = numeric(), y = numeric())
for(j in 1:10000)
{
x[j,] = distance(A[i,], B[j,])
}
A[i,]$associated_row_B = x[which.min(x[1,]),1]
}
делает в основном то, что я хочу (мне все еще нужно решить, если наблюдения имеют одинаковое расстояние).Но так как я использую dplyr
, мне почти никогда не приходилось использовать цикл for.Моему решению нужны даже два цикла, поэтому мне интересно, есть ли возможность избежать цикла for, используя решение из dplyr
/ tidyverse
.
Очень простой пример:
A:
i a b
1 -0.5920377 a
2 0.4263199 b
3 0.6737029 a
4 1.3063658 c
5 0.1314103 d
B:
i a b
1 -0.30201541 a
2 -0.07093386 b
3 0.96317764 c
4 -0.33303061 d
5 -1.00834895 d
и функция расстояния:
distance = function(x,y) return(c((x[2] - y[2])^2 + abs(x[3] - y[3]), y[1])
Первый элемент возвращаемого значения - это фактическое расстояние, второе значение -идентификатор из B.