我有以下两个数据帧:
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
在左边。
是否有一种有效的方法来做到这一点? (通常,我也希望在多列中实现这一点。)
答案 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
传递df1
和df2
。然后,对于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)