2017-01-25 6 views
0
に複数の変数を追加します

私のデータは以下の通りである:はdata.table

gvkey datadate fyear  cusip curcd  at ceq csho dltt dvc nopi oibdp prstkc 
1: 1001 12/31/1981 1981 000165100 USD  NA  NA NA  NA NA NA NA  NA 
2: 1001 12/31/1982 1982 000165100 USD  NA  NA NA  NA NA NA NA  NA 
3: 1001 12/31/1983 1983 000165100 USD 14.080 7.823 3.568 4.344 0 0.640 2.650 0.000 
4: 1001 12/31/1984 1984 000165100 USD 16.267 8.962 3.568 4.181 0 0.575 3.208 0.000 
5: 1001 12/31/1985 1985 000165100 USD 39.495 13.014 3.988 11.908 0 0.623 7.247 0.009 
6: 1003 12/31/1981 1981 000354100 USD  NA  NA NA  NA NA NA NA  NA 
    pstkrv prcc_c year   REP 
1:  NA  NA 1981   NA 
2:  NA  NA 1982   NA 
3:  0 7.250 1983   NA 
4:  0 3.750 1984 0.0000000000 
5:  0 10.125 1985 0.0002278769 
6:  NA  NA 1981   NA 

私は既存のものに基づいており、いくつかの変数を追加したい、と私のコードは以下の通りです:

Compustat.1<-Compustat.1[, `:=`(DIV= dvc/at, 
           REPR= REP/(REP+DIV), 
           PCASH= oibdp/at, 
           TCASH= nopi/at, 
           CASHVOL= data.table::shift(rollapply(PCASH,5,FUN=sd,fill=NA,align="right"),1,fill=NA), 
           SIZE= at, 
           LEV= dltt/at, 
           MB= prcc_c*csho), 
           by=cusip] 

私はすでに最初のステップで可変DIVを定義しているので、私はWHAを把握することができなかったエラーメッセージ

Error in `[.data.table`(Compustat.1, , `:=`(DIV = dvc/at, REPR = REP/(REP + : 
    object 'DIV' not found 

を受信維持問題はありません。

+0

エラーがREPR = REP /(REP + DIV 'から来るべきで、うまく動作するはずの場所で変数が作成されます。また、ためCompustat.1を割り当てする必要がないことに注意してください) '。 'DIV'は代入文全体を実行する前に' Compustat.1'で定義されています。それが見つからないのです。 – kitman0804

+0

この問題を解決するにはどうすればよいですか? – Bobo

+0

あなたは 'DIV = DIV < - dvc/at'や後で再利用される他のどの列に対しても同様のことができます.PCASHのように思えます。あなたがしようとしている機能リクエストはここにあります:https://github.com/Rdatatable/data.table/issues/659 – Frank

答えて

0

私たちは、私は、問題はそれがまだ作成されていないときは、DIVへの参照をしているということであると考えてい{}

Compustat.1[, c("DIV", "REPR", "PCASH", "TCASH", "SIZE", "LEV", "MB") := 
      {DIV <- dvc/at 
      REPR <- REP/(REP+DIV) 
      PCASH <- oibdp/at 
      TCASH <- nopi/at 
      #CASHVOL <- data.table::shift(rollapply(PCASH,5,FUN=sd,fill=NA,align="right"),1,fill=NA) 
      SIZE <- at 
      LEV <- dltt/at 
      MB <- prcc_c*csho 
      .(DIV, REPR, PCASH, TCASH, SIZE, LEV, MB)}, by=cusip] 
+0

OPにデータを追加することはできますか?私はこの使用法を見たことがないし、それがどのように動作するか把握したい。 – Frank

+0

'< - 'の代わりに '='を使用できますか? – Bobo

+0

@Boboこれを使うこともできますが、 '<-'を使うほうがいいです – akrun

0

以内にこれを行うことができます。 DIVの式が簡単だとすれば、REPRの式に直接コピーすることをお勧めします。 PCASHでも同じです。 ':=' は:

Compustat.1[, `:=`(DIV= dvc/at, 
        REPR= REP/(REP + dvc/at), 
        PCASH= oibdp/at, 
        TCASH= nopi/at, 
        CASHVOL= data.table::shift(rollapply(oibdp/at,5,FUN=sd,fill=NA,align="right"),1,fill=NA), 
        SIZE= at, 
        LEV= dltt/at, 
        MB= prcc_c*csho), 
        by=cusip]