Я не уверен, нужна ли вам какая-либо техника машинного обучения для этого.Разве простой математики не достаточно?
Давайте предположим, что у вас есть два фрейма данных df1
и df2
.Как вы упомянули, df2
имеет только одну запись, поэтому мы можем вычесть это значение из каждой строки в df1
, взять абсолютное значение и найти строку с минимальной разностью, которая даст вам строку 1 из df1
.
df1[which.min(rowSums(abs(df1[-1] - df2[rep(1, nrow(df1)), -1]))), ]
# Team Var1 Var2 Var3
#1 A 4 5 6
Позволяет разбить его, чтобы понять пошагово
Повторить строки в df2
, чтобы они были такой же длины, как df1
df2[rep(1, nrow(df1)), -1]
# Var1 Var2 Var3
#1 5 5 4
#1.1 5 5 4
#1.2 5 5 4
Вычтите df2
из df1
df1[-1] - df2[rep(1, nrow(df1)), -1]
# Var1 Var2 Var3
#1 -1 0 2
#2 5 5 6
#3 10 9 14
Возьмите абсолютное значение кадра данных и используйте rowSums
, чтобы вычислить абсолютную разницу в каждой строке в df1
из df2
rowSums(abs(df1[-1] - df2[rep(1, nrow(df1)), -1]))
#[1] 3 16 33
Выберите строку с минимальной разницей, используя which.min
which.min(rowSums(abs(df1[-1] - df2[rep(1, nrow(df1)), -1])))
#[1] 1
Наконец, задайте для этой строки подмножество из df1
df1[which.min(rowSums(abs(df1[-1] - df2[rep(1, nrow(df1)), -1]))), ]
# Team Var1 Var2 Var3
#1 A 4 5 6
Как упомянуто @ r2evansесли в df2
имеется большее количество строк и вы хотите найти ближайшую строку в df1
для каждой строки в df2
, мы можем использовать lapply
для циклического перемещения по каждому индексу строки и получения списка ближайших строк.
lapply(seq_len(nrow(df2)), function(i)
df1[which.min(rowSums(abs(df1[-1] - df2[rep(i, nrow(df1)), -1]))), ])
data
df1 <- structure(list(Team = structure(1:3, .Label = c("A", "B", "C"
), class = "factor"), Var1 = c(4L, 10L, 15L), Var2 = c(5L, 10L,
14L), Var3 = c(6L, 10L, 18L)), class = "data.frame", row.names = c(NA,
-3L))
df2 <- structure(list(Team = structure(1L, .Label = "D", class = "factor"),
Var1 = 5L, Var2 = 5L, Var3 = 4L), class = "data.frame", row.names = c(NA,-1L))