Каков наилучший способ найти минимальную разницу и соответствующее значение при поэлементном сравнении векторов? - PullRequest
1 голос
/ 11 февраля 2020

У меня есть одна проблема.
Вектор A - это запрос, Вектор B - это ссылка.
Я хочу посмотреть, какое значение A является ближайшим к одному из значений B.
Оба вектора заказано.

ВХОД

A = c(1, 1.2, 4, 8, 9, 10, 30)
B = c(0.1, 3.9)

ВЫХОД

min_diff_value = 0.1
min_value_A = 4
min_value_B = 3.9 (optionnal)

Я хочу знать, может ли быть хитрость, чтобы выполнить это без затрат времени l oop?
Спасибо.

Ответы [ 2 ]

5 голосов
/ 11 февраля 2020

Вы можете использовать outer

A = c(1, 1.2, 4, 8, 9, 10, 30)
B = c(0.1, 3.9)

mat <- outer(A, B, `-`)
min_diff_value <- min(abs(mat))
dim <- which(mat == min_diff_value, arr.ind = TRUE)
min_value_A <- A[dim[, 1]]
min_value_B <- B[dim[, 2]]

min_diff_value
#[1] 0.1
min_value_A
#[1] 4
min_value_B
#[1] 3.9
2 голосов
/ 11 февраля 2020

Другая идея заключается в использовании expand.grid, то есть

df1 <- transform(expand.grid(A, B), var3 = abs(Var1 - Var2))

min_diff_value <- min(df1$var3)
#[1] 0.1
min_value_A <- df1$Var1[which.min(df1$var3)]
#[1] 4
min_value_B <- df1$Var2[which.min(df1$var3)]
#[1] 3.9
...