匹配来自两个具有最接近值的数据帧的行

时间:2016-09-15 10:03:08

标签: r match

希望任何人都能帮助我解决这个问题。我正在研究分支机构。我有两个数据集:df.ref(参考)和df.tst(建模)。该引用指出有三个分支df.ref$ID,每个分支的宽度和长度值。

df.ref <- data.frame(ID=c(1,2,3))
df.ref$length <- c(1.3,1.8,2.3)
df.ref$width <- c(0.5,0.7,0.9)
df.ref

df.tst包含对相同三个分支的建模测量。但是,有更多分支,六个df.tst$ID,其长度和宽度也是如此。

df.tst <- data.frame(ID=c(1,2,3,4,5,6))
df.tst$length <- c(1.1,1.5,1.8,1.8,2.1,2.6)
df.tst$width <- c(0.6,0.6,0.7,0.9,0.8,1.0)
df.tst

我想使用阈值内的长度和宽度值(例如0.2)来匹配建模到参考的最接近的值。结果可能是这样的:

results <- data.frame(ID.ref=c(1,2,3))
results$ID.tst.match <- c(1,3,5)
results

我尝试使用find.matches,但结果并不像预期的那样。我也在考虑使用RMSE来查看每行的最小RMSE,并进行迭代,但必须有一个更清晰的解决方案。

此外,可能存在没有解决方案(超出阈值)的情况。 感谢!!!

1 个答案:

答案 0 :(得分:0)

您可以使用的一种方法是使用dist函数测量数据点之间的所有成对欧氏距离:

> dist_mat <- as.matrix(dist(combined[,c('length', 'width')]))
> dist_mat
          1         2         3         4         5         6         7         8         9
1 0.0000000 0.4000000 0.7071068 0.7615773 1.0198039 1.5524175 0.2236068 0.7071068 1.2369317
2 0.4000000 0.0000000 0.3162278 0.4242641 0.6324555 1.1704700 0.2236068 0.3162278 0.8544004
3 0.7071068 0.3162278 0.0000000 0.2000000 0.3162278 0.8544004 0.5385165 0.0000000 0.5385165
4 0.7615773 0.4242641 0.2000000 0.0000000 0.3162278 0.8062258 0.6403124 0.2000000 0.5000000
5 1.0198039 0.6324555 0.3162278 0.3162278 0.0000000 0.5385165 0.8544004 0.3162278 0.2236068
6 1.5524175 1.1704700 0.8544004 0.8062258 0.5385165 0.0000000 1.3928388 0.8544004 0.3162278
7 0.2236068 0.2236068 0.5385165 0.6403124 0.8544004 1.3928388 0.0000000 0.5385165 1.0770330
8 0.7071068 0.3162278 0.0000000 0.2000000 0.3162278 0.8544004 0.5385165 0.0000000 0.5385165
9 1.2369317 0.8544004 0.5385165 0.5000000 0.2236068 0.3162278 1.0770330 0.5385165 0.0000000

由于这包括数据帧内和数据帧比较,因此您只能提取不同数据帧中元素之间的距离:

> type_ind <- combined$type == 'test'
> type_ind
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
> cross_comparisons <- dist_mat[type_ind, !type_ind]
> rownames(cross_comparisons) <- df.tst$ID
> colnames(cross_comparisons) <- df.ref$ID
> cross_comparisons
          1         2         3
1 0.2236068 0.7071068 1.2369317
2 0.2236068 0.3162278 0.8544004
3 0.5385165 0.0000000 0.5385165
4 0.6403124 0.2000000 0.5000000
5 0.8544004 0.3162278 0.2236068
6 1.3928388 0.8544004 0.3162278

接下来,要确定三个参考数据点中每一个的最近点,您只需在每列中找到最小值:

> apply(cross_comparisons, 2, which.min)
1 2 3 
1 3 5 

要检查距离是否在您的阈值范围内,您可以执行以下操作:

> threshold <- 0.2
> apply(cross_comparisons, 2, function(x) { any(x < threshold) })
    1     2     3 
FALSE  TRUE FALSE