有效地比较2个表中的元素

时间:2013-06-22 11:05:28

标签: r

我想知道是否有一些内置函数可以帮助我有效地执行以下算法。 假设表1和表2带有size(table 2) < size(table1)

对于表1中的每个元素,我搜索整个表2,直到满足表1中的列和表2中的列之间的条件。具体来说,我想在表2中找到abs(table1$c1[j]- table2$c1)<0.01 for each j.

的c2列值

我现在使用了返回

的table1的for循环
 for each j        
    table2$c2[abs(table1$c1[j]- table2$c1)<0.01]

但这真的很慢。

2 个答案:

答案 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]