在数据帧之间找到几乎相同的行

finding nearly identical rows between data frames

我有以下两个数据框:

df1 = data_frame(x = c(1128.4, 1101.2), y = c(124.5, 325.2)

df2 = data_frame(x = c(1128.7, 1100.5, 1527.8, 1347.5), y = c(83.2, 124.2, 
370.3, 325.5))

我想在 df1 中找到与 df2 中的行 几乎相同 (任一方向相差 1%)的行能够对 df1 中的数百行执行此操作的非常有效的方法,而不是更大的 df2

预期的输出将是,例如列表:

L$x = c(1,2)
L$y = c(2,4)

表示每列中相似的行。

如果任务是找到完全相同的行,我会使用 left_join,当然,较小的 df1 会在左边。

有没有有效的方法来做到这一点? (一般来说,我也想为多列实现这一点)。

我认为这不是最有效的方法,但一种方法是使用 Map 传递 df1df2。然后对于 df1 中的每个值,我们 select 在 df2 中对应值的绝对差异的最小索引。

Map(function(x, y) sapply(x, function(i) which.min(abs(i - y))), df1, df2)

#$x
#[1] 1 2

#$y
#[1] 2 4

检查 1% 条件

Map(function(x, y) sapply(x, function(i) {
    inds = abs(i - y)
    if (any(inds/y <= 0.01)) which.min(inds) else NA
}), df1, df2)

data.table,您将获得最快的解决方案:

library(data.table)
df1 = data.table(x = c(1128.4, 1101.2))
df2 = data.table(x = c(1128.7, 1100.5, 1527.8, 1347.5))

setkey(df2,x)
df2[,y := x]
df2[J(df1$x),roll = "nearest"][abs(x-y)/y < 0.01]

        x      y
1: 1128.4 1128.7
2: 1101.2 1100.5