我想知道是否有一些内置函数可以帮助我有效地执行以下算法。
假设表1和表2带有size(table 2) < size(table1)
。
对于表1中的每个元素,我搜索整个表2,直到满足表1中的列和表2中的列之间的条件。具体来说,我想在表2中找到abs(table1$c1[j]- table2$c1)<0.01 for each j.
我现在使用了返回
的table1的for循环 for each j
table2$c2[abs(table1$c1[j]- table2$c1)<0.01]
但这真的很慢。
答案 0 :(得分:0)
归档所需内容的一种方法是使用sqldf包。它允许您在SQL语法中表达联接,因此您可以使用上面的条件。
但是,如果没有直接在R中使用数据库,可能会有一种更有效的方法。但是,如果您熟悉SQL,那么在编程方面这可能非常节省时间。
如果没有可重复的示例,我无法为您提供经过测试的代码。
答案 1 :(得分:0)
我们可以使用data.table来执行此操作,其中第一列是table2 $ c1,第二列是相应的table1 $ c1。
这里有一些数据:
set.seed(123)
library(data.table)
## this replaces your table1$c1
xx <- seq(0.0,99,0.1)
## choose 6 variable and add some offset ( 0.01 and -0.01)
y <- c(sample(xx,3) + 0.01 ,sample(xx,3) - 0.01)
data.table(c1 = xx,xx,key =“c1”)[J(y),, roll ='nearest',rollends = TRUE]
现在将选项roll
设置为nearest
,我们得到:
data.table(c1 = xx, xx, key = "c1")[J(y),,
roll = 'nearest', rollends = TRUE]
c1 xx
1: 28.41 28.4
2: 78.01 78.0
3: 40.41 40.4
4: 87.49 87.5
5: 93.09 93.1
6: 4.49 4.5
列xx是表$ c1的最近值。如果你想设置距离你可以像这样设置滚动到0.01 / -0.01:
data.table(c1 = xx, xx, key = "c1")[J(y),,
roll = 0.01, rollends = TRUE]
或
data.table(c1 = xx, xx, key = "c1")[J(y),,
roll = -0.01, rollends = TRUE]