2017-01-25 8 views
0

Meine Daten hinzufügen ist wie folgt:mehrere Variablen zu 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 

ich mehrere Variablen hinzufügen möchten, die auf den bestehenden basieren, und mein Code wie folgt:

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] 

I gehalten, um die Fehlermeldung empfangen

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

Da ich bereits die variable DIV in dem ersten Schritt definiert haben, konnte ich nicht WHA herauszufinden t das Problem ist.

+0

Der Fehler sollte von 'REPR = REP/(REP + DIV) '. 'DIV' ist in' Compustat.1' definiert, bevor die gesamte Zuweisungsanweisung ausgeführt wird, deshalb wird sie nicht gefunden. – kitman0804

+0

Wie kann ich dieses Problem beheben? – Bobo

+0

Sie können 'DIV = DIV <- dvc/at' und ähnlich für alle anderen Spalten, die später wieder verwendet werden, wie PCASH, denke ich. Die Feature-Anfrage für das, was Sie versuchen, ist hier: https://github.com/Rdatatable/data.table/issues/659 – Frank

Antwort

0

Wir können dies tun, in {}

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

Können Sie die Daten zum OP oder hier hinzufügen? Ich habe diese Verwendung noch nie gesehen und möchte herausfinden, wie es funktioniert. – Frank

+0

Kann ich '=' anstelle von '<-' verwenden? – Bobo

+0

@Bobo Sie könnten das verwenden, aber es ist besser, '<-' zu verwenden – akrun

0

ich glaube, das Problem ist, dass Sie einen Verweis machen DIV, wenn es noch nicht erstellt worden. Da die Formel für DIV einfach zu sein scheint, würde ich vorschlagen, sie direkt in die Formel für REPR zu kopieren. Gleiches gilt für PCASH. Beachten Sie auch, dass Compustat.1 Zuordnung nicht notwendig ist, weil ': =' die Variablen in Platz schafft:

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] 

Sollte gut funktionieren,

Verwandte Themen