0

次のアルゴリズムを効率的に実行するのに役立つ組み込み関数があるかどうかを知りたいです。表 1 と表 2 を と仮定しsize(table 2) < size(table1)ます。

テーブル 1 の各要素について、テーブル 1 の列とテーブル 2 の列の間の条件が満たされるまで、テーブル 2 全体を検索します。具体的には、テーブル 2 の c2 の列の値を見つけたいと考えています。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]

しかし、これは本当に遅いです。

4

2 に答える 2

0

これは、最初の列が table2$c1 で、2 番目の列が対応する table1$c1 であるような data.table を使用して実行できます。

ここにいくつかのデータがあります:

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 = '最も近い', 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 に答える