对于一个数据框中的每一行,在另一个数据框中找到最相似的行

for every row in one data frame find the most similar row in another

我有两个包含布尔值和数值的数据框。如果需要,可以将数值放入类别中。

var1 <- c(400,234,199,45,77,19)
var2 <- c(0,0,1,1,0,1)
var3 <- c(1,0,1,0,0,1) 
df1 <- data.frame(var1,var2,var3)
var.1 <- c(78,147,670,200,75,17)
var.2 <- c(0,0,0,1,1,1)
var.3 <- c(0,1,1,0,1,1) 
df2 <- data.frame(var.1,var.2,var.3)

我想在 df1 中找到 df2 中最相似的行。

我知道聚类分析,我可以单独对一个数据框进行聚类分析,但是一旦我对一个数据框进行了聚类,我将如何提取相同的聚类算法并将其应用于另一个数据框,所以两个数据帧都以相同的方式聚类?我还需要与数据框中的行一样多的 "clusters",这让我觉得聚类分析不适合这项任务。

此外,df1 中的每一行必须仅与 df2 中的一行匹配,以便在过程结束时 df1 中的每一行与df2。这很棘手,因为如果在 df1 中单独获取每一行,df2 中的同一行可能会匹配多次,这是不希望的。

不用聚类,只搜索距离最小的。取第一行 df1cbinddf2。这是最简单的,如果列名相同

var1 <- c(400,234,199,45,77,19)
var2 <- c(0,0,1,1,0,1)
var3 <- c(1,0,1,0,0,1) 
df1 <- data.frame(var.1,var.2,var.3)
var.1 <- c(78,147,670,200,75,17)
var.2 <- c(0,0,0,1,1,1)
var.3 <- c(0,1,1,0,1,1) 
df2 <- data.frame(var.1,var.2,var.3)

rbind(df1[1,], df2)

这个结果可以用dist检查。我们只对结果的第一列感兴趣,i。 e.第 nrow(df2) 个结果。

dist(rbind(df1[1,], df2))[1:nrow(df2)]

评估为

> dist(rbind(df1[1,], df2))[1:nrow(df2)]
[1]   0.000000  69.007246 592.000845 122.004098   3.316625
[6]  61.016391

which.min告诉我们,哪一行的距离最小:

> which.min(dist(rbind(df1[1,], df2))[1:nrow(df2)])
[1] 1

所以df2中的第一行到df1中的第一行的距离最小。您可以将其放入 applyfor 循环中,以对 df1.

中的每一行进行计算

不过你必须回答这个问题,布尔值和数值混合的距离应该如何计算。没有通用的答案。