对于一个数据框中的每一行,在另一个数据框中找到最相似的行
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
中的同一行可能会匹配多次,这是不希望的。
不用聚类,只搜索距离最小的。取第一行 df1
和 cbind
用 df2
。这是最简单的,如果列名相同
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
中的第一行的距离最小。您可以将其放入 apply
或 for
循环中,以对 df1
.
中的每一行进行计算
不过你必须回答这个问题,布尔值和数值混合的距离应该如何计算。没有通用的答案。
我有两个包含布尔值和数值的数据框。如果需要,可以将数值放入类别中。
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
中的同一行可能会匹配多次,这是不希望的。
不用聚类,只搜索距离最小的。取第一行 df1
和 cbind
用 df2
。这是最简单的,如果列名相同
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
中的第一行的距离最小。您可以将其放入 apply
或 for
循环中,以对 df1
.
不过你必须回答这个问题,布尔值和数值混合的距离应该如何计算。没有通用的答案。