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

时间:2017-11-30 16:45:30

标签: r nearest-neighbor

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

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中最相似的行。

我知道集群分析,我可以单独为一个数据框做,但是一旦我有一个数据帧的集群,我将如何提取并应用相同的集群算法到另一个数据帧,这样两者都可以数据框是否以相同的方式聚类?我还需要与数据框中的行一样多的“集群”,这使我认为集群分析不适用于此任务。

此外,df1中的每一行必须只与df2中的一行匹配,以便在流程结束时df1中的每一行都匹配df2中的不同行1}}。这很棘手,因为如果在df1中隔离每一行,df2中的同一行可能会多次匹配,这是不可取的。

1 个答案:

答案 0 :(得分:1)

您不必进行群集,只需搜索最小距离。将第一行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。即第一个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中的每一行进行计算。

你必须回答这个问题,应该如何计算布尔值和数值混合的距离。对此没有普遍的答案。