0

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

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

我目前使用了一个 for 循环 for table1 返回

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

但这真的很慢。

4

2 回答 2

0

归档所需内容的一种方法是使用sqldf包。它允许你用 SQL 语法来制定连接,因此你可以使用上面的条件。

但是,可能有一种更有效的方法,而不是直接在 R 中访问数据库的方法。但是,如果您熟悉 SQL,那么这在编程方面可能非常省时。

但是,如果没有可重现的示例,我无法为您提供经过测试的代码。

于 2013-06-22T12:44:12.520 回答
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 列是最接近 table$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]
于 2013-06-22T17:46:54.067 回答