6

2 つの文字変数に基づいて変数を作成したい data.table X があります。

   X[, varC :=((VarA =="A" & !is.na(VarA)) 
               | (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB))
                )
      ]

このコードは機能しますが、2 文字の変数に対してベクトル スキャンを実行するため、非常に低速です。VarA と VarB によってキー claim4 テーブルを設定しないことに注意してください。data.table でこれを行う「正しい」方法はありますか?

更新 1: 他の変数変換に既に setkey(X, Year, ID) を使用しているため、この変換には setkey を使用しません。その場合、この変換後にキーを年、ID にリセットする必要があります。

更新 2: 私はマシューのアプローチで私のアプローチをベンチマークしましたが、彼ははるかに高速です:

          test replications elapsed relative user.self sys.self user.child sys.child
2 Matthew               100   3.377    1.000     2.596    0.605          0         0
1 vectorSearch          100 200.437   59.354    76.628   40.260          0         0

唯一のマイナーなことは setkey であり、 re-setkey はやや冗長です:)

4

1 に答える 1

6

どうですか :

setkey(X,VarA,VarB)
X[,varC:=FALSE]
X["A",varC:=TRUE]
X[J("A","AB"),varC:=TRUE]

または、1行で(変数の繰り返しを保存Xして実証するため):

X[,varC:=FALSE]["A",varC:=TRUE][J("A","AB"),varC:=TRUE]

要求に応じてキーを設定しないようにするには、手動のセカンダリ キーを使用します。

S = setkey(X[,list(VarA,VarB,i=seq_len(.N))],VarA,VarB)
X[,varC:=FALSE]
X[S["A",i][[2]],varC:=TRUE]
X[S[J("A","AB"),i][[3]],varC:=TRUE]

明らかに、その構文は醜いです。したがって、FR#1007 ビルドイン セカンダリ キーは、それを構文に組み込むことです。例えば、

set2key(X,varA,varB)
X[...some way to specify which key to join to..., varC:=TRUE]

それまでの間は、上記のように手動で行うことができます。

于 2012-12-01T14:38:41.333 に答える