2012-12-02 15 views
5

私はdata.tableを使って簡単なループを行いたいと思います。私は(var_20にVAR_1から)20二分(0,1)の変数を持っていると私はこのためにループを行いたいと思います:data.tableを持つ単純なループ

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 
... 
dat[var_20==1, newvar:=21] 

私の主な問題は、私は私(すなわちVAR_1 =を指定する方法がわからないです= 1、var_2 == 2 ...)ループを使用しています。短い例以下は :

var_1 <- c(1, rep(0,9)) 
var_2 <- c(0,1, rep(0,8)) 
var_3 <- c(0,0,1, rep(0,7)) 
dat <- data.table(var_1, var_2, var_3) 

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 

ループでこれを行う方法についての任意のアイデア? ありがとう!

答えて

4

data.tableクラスを利用するには、keyを設定することをお勧めします。

dat[ ,newvar:= NA_integer_] 
for(i in ncol(dat)) { 
setkeyv(dat, names(dat)[i]) 
dat[J(1), newvar:=i] 
} 
+0

ありがとうございます。そのnewvarを行う方法を知っていますか?= 1Lが1から変数の数に増加します(たとえば、newvarはvar_2の場合は2、var_3の場合は3など)。また、いくつかの変数に値1が同時に設定されている可能性もあります。その場合は、より大きな値(例えば、var_1 = 1、var_3 = 1、newvar = 3を取得したい場合)を代入したいと考えています。 – sdaza

+0

上記のコードはこれを行う必要があります。私は大規模なdata.tablesでシーケンシャルしかし単一のベクトルスキャンと比較してキーを繰り返し設定することのパフォーマンスに興味があるだろう – mnel

+0

@WojciechSobala通常は、setkeyを使うほうが良いが、setkeyはソートの過程で列のすべての値(スキャン)それ。したがって、単一列の単一値を1回スキャンする特別な場合、ベクトルスキャンはsetkey + joinよりも速くなければなりません。テストする価値はありますが、私はそれを自分でテストしていません。 –

4

このようなものが動作します。

nams <- names(dat) 
for(n in seq_along(nams)){ 
    nam <- nams[n] 
    char <- sprintf('%s==1',nam) 
    dat[eval(parse(text=char)), newvar := n] 
} 
dat 
var_1 var_2 var_3 newvar 
1:  1  0  0  1 
2:  0  1  0  2 
3:  0  0  1  3 
4:  0  0  0  NA 
5:  0  0  0  NA 
6:  0  0  0  NA 
7:  0  0  0  NA 
8:  0  0  0  NA 
9:  0  0  0  NA 
10: 0  0  0  NA 
+0

ありがとうございました! – sdaza

関連する問題