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

时间:2019-04-17 12:31:22

标签: r dataframe vectorization

我有以下两个数据帧:

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在左边。

是否有一种有效的方法来做到这一点? (通常,我也希望在多列中实现这一点。)

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:2)

我不认为这是最有效的方法,但是一种方法是使用Map传递df1df2。然后,对于df1中的每个值,我们选择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)