2016-06-27 3 views
1

Rに〜10mmの行data.tableがあり、変数の値の一部を更新するコードを書いています。残念ながら、ループ文を使用する必要があります。iの代入演算子:=を複数の条件で使用すると、コードは非常に遅くなります(1ループあたり約2.3分)。私は複数の条件と代入演算子を組み合わせるより効率的な方法があるのだろうかと思っていました。例えば:私がする必要がどのようなR:複数の条件でdata.tableに値を割り当てる効率的な方法

require(data.table) 
    set.seed(123) 
    x <- data.table(V1 = LETTERS[1:3], V2 = rnorm(10), V3 = NA) 
    y <- data.table(V1 = LETTERS[1],V3 = TRUE) 

    x 
     V1   V2 V3 
    1: A -0.56047565 NA 
    2: B -0.23017749 NA 
    3: C 1.55870831 NA 
    4: A 0.07050839 NA 
    5: B 0.12928774 NA 
    6: C 1.71506499 NA 
    7: A 0.46091621 NA 
    8: B -1.26506123 NA 
    9: C -0.68685285 NA 
    10: A -0.44566197 NA 

    y 
     V1 V3 
    1: A TRUE 

y$V3x$V3に与えられた一定の条件を割り当てることです。

x[V1==y$V1 & V2 >= 0,V3:=y$V3] 

    x 
     V1   V2 V3 
    1: A -0.56047565 NA 
    2: B -0.23017749 NA 
    3: C 1.55870831 NA 
    4: A 0.07050839 TRUE 
    5: B 0.12928774 NA 
    6: C 1.71506499 NA 
    7: A 0.46091621 TRUE 
    8: B -1.26506123 NA 
    9: C -0.68685285 NA 
    10: A -0.44566197 NA 

ただし、これは自分のコードでは時間がかかりすぎます。

おかげで、最新の開発版では

+0

あなたはおそらく両方のセットに 'V1'するキーを設定して、' X [Y]をやったほうが良いと思います'参加する。 – thelatemail

+0

これはもっと知ることなく解決するのが難しいと思います。私はちょうど10Mの行にあなたの操作を実行し、それは1秒で完了しました...私はここでもっと続ける必要があると感じます – Jason

+0

@thelatemail応答に感謝します。この場合、結合文に第2の条件 'V2> = 0'を含める方法はありますか?私の実際のコードでは、私は主キーを持っていません。代わりに、PKの不在を「補っている」〜10条件文の組み合わせです。 –

答えて

3

あなたは非エクイが参加しています1.9.7。その後、yデータセットにV2 := 0を追加し、非等価結合を続行することができます。

y[, V2 := 0] 
x[y, V3 := i.V3, on=.(V1, V2>=V2)][] 
# V1   V2 V3 
# 1: A -0.56047565 NA 
# 2: B -0.23017749 NA 
# 3: C 1.55870831 NA 
# 4: A 0.07050839 TRUE 
# 5: B 0.12928774 NA 
# 6: C 1.71506499 NA 
# 7: A 0.46091621 TRUE 
# 8: B -1.26506123 NA 
# 9: C -0.68685285 NA 
#10: A -0.44566197 NA 

(数値)フィールドは、浮動小数点によって影響を受ける可能性があるdoubleに参加することに注意して、詳細については?setNumericRoundingをお読みください。次を使用し、最新の開発版をインストールするには

install.packages("data.table", repos="https://Rdatatable.github.io/data.table") 
+0

提案に感謝します。それは私の必要性に合っているようですが、私は構文にいくつかの問題があります。私は 'data.table'パッケージのドキュメントをチェックしましたが、' on = '引数が条件文の' x'と 'y'のオブジェクトを区別する方法を理解できませんでした。例えば、関数が 'V2> = V2'ステートメントでどの' V2'を特定しているのか さらに、一部の条件が1つのdata.tableのみを参照する可能性があります(たとえば、「V2> = V2」の代わりに「V2> = 0.5」)。 –

+0

@PietroFranzero良い質問ですが、[data.table#1452](https://github.com/Rdatatable/data.table/issues/1452)を見ると '?data.table'(documentation)がまだ完了していないタスク。 'on'では、LHSは' x'を参照し、RHSは 'i'を参照します。単一のカラム名は '=='に展開されるので、 'on =。(V1 == V1、V2> = V2)'となります。 – jangorecki

+0

@PietroFranzero 'on'の式を使用することに関する2番目の質問は、まだtodoリストにあります。詳しくは、[data.table#1639](https://github.com/Rdatatable/data.table参照)を参照してください。/issues/1639)。 – jangorecki

関連する問題