2017-01-25 89 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] 

我保持收到錯誤消息

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

由於我已經在第一步驟中定義的變量DIV,我無法弄清楚WHA問題是。

+0

錯誤應該來自'REPR = REP /(REP + DIV )'。 'DIV'在運行整個賦值語句之前在'Compustat.1'中定義,這就是爲什麼沒有找到它。 – kitman0804

+0

我該如何解決這個問題? – Bobo

+0

你可以對'DIV = DIV < - dvc/at'做類似的處理,並且對於其他任何可以在以後重用的cols,比如PCASH,我認爲是類似的。對於你正在嘗試的功能請求已經在這裏:https://github.com/Rdatatable/data.table/issues/659 – Frank

回答

0

我們可以在{}

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是沒有必要的,因爲 ':=' 創建替代變量:

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] 

應該很好地工作,