在数据帧之间找到几乎相同的行
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
传递 df1
和 df2
。然后对于 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
我有以下两个数据框:
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
传递 df1
和 df2
。然后对于 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