2014-02-20 87 views
0

我相信我失去了一些東西簡單,但如何計算使用data.tables R中日回報?[R data.table回報計算和set()

比方說,我有一個像data.table:

DT <- data.table(ticker=rep(letters,each=5), priceA=runif(5*26^2), priceB=runif(5*26^2))

如何我形成價格的每個股票的回報率分別新列?

通過返回我的意思是正常比例的回報。也就是說,ticker a的priceA的第二個值減去同一個ticker的前一個值,然後除以前一個值。

鑑於同列股票的例子,priceA和priceB我應該得到的列returnsA爲:

 ticker  priceA  priceB returnsA 
    1:  a 0.63519775 0.04784728 
    2:  a 0.01530738 0.34917328 -0.97590 
    3:  a 0.28601406 0.12307475 17.68472 
    4:  a 0.77851212 0.47829863 1.721937 
    5:  a 0.84078779 0.23491432 0.079993 

而且,我怎麼使用的set()代替:=使某物像

DT[, newprice := priceA * priceB]

謝謝! :)

+1

對於'set',也許'DT [,newprice:= NA];集(DT,J = 4L,值= DT [[ 'priceA']] * DT [[ 'priceB']])'您沒有定義的 「返回」 愛好。 – Frank

+0

謝謝你的回答,這正是我想要的set()。我更新了我的問題並添加了一個示例。 – pidosaurus

回答

3

好了,這個工程:

set.seed(42) 
DT <- data.table(
    ticker=rep(letters,each=5), 
    priceA=runif(5*26^2), 
    priceB=runif(5*26^2)) 

DT[,paste('returns',LETTERS[1:2],sep=''):={ 
    lapply(.SD,function(x){ 
    old <- head(x,-1) 
    new <- tail(x,-1) 
    c(NA,(new-old)/old) 
    }) 
},by=ticker,.SDcols=grep('^price',names(DT))] 

的結果(該種子值)是

 ticker priceA priceB returnsA returnsB 
    1:  a 0.9148060 0.7956245   NA   NA 
    2:  a 0.9370754 0.9314941 0.02434327 0.1707710 
    3:  a 0.2861395 0.6269996 -0.69464620 -0.3268883 
    4:  a 0.8304476 0.1666758 1.90224707 -0.7341691 
    5:  a 0.6417455 0.6483800 -0.22722939 2.8900659 
    ---             
3376:  z 0.2887293 0.3473923 -0.54132570 -0.3514041 
3377:  z 0.9013438 0.1788842 2.12176058 -0.4850656 
3378:  z 0.3126429 0.7648157 -0.65313686 3.2754788 
3379:  z 0.8791381 0.1300418 1.81195584 -0.8299698 
3380:  z 0.8160158 0.8159330 -0.07180019 5.2743905 

要在你的榜樣使用set:也

DT[,newprice:=NA] 
set(DT,j=ncol(DT),value=DT[['priceA']]*DT[['priceB']]) 

,有專爲處理退貨和這樣的包,如在這裏看到:Calculating %changes with the By()

+0

所以,它並不那麼簡單。 :) 非常感謝你。對於任何感興趣的人來說,http://stackoverflow.com/questions/14937165/using-dynamic-column-names-in-data-table和http://stackoverflow.com/questions/8508482/what-does-sd-stand- for-in-data-table-in-r有助於理解.SDcols – pidosaurus

+1

不客氣。是的,實際上'.SDcols'不是嚴格需要的,如果你的DT看起來像這樣(因爲'.SD'的列將默認除了「ticker」以外的每一列,因爲它在'by'中)。我在這裏使用它是因爲(1)如果你在沒有它的情況下連續運行兩次操作,你會發現奇怪的結果; (...)(2)和'grep','head'一起了解'[[',等等,如果它們對你或其他人來說是新的,或者碰到這個問題的其他人)是有用的:)無論如何,那些是你在那裏找到的很好的參考。 – Frank

+0

我想了解你的工作解決方案,我正在嘗試修改它。假設我想使用庫(quantmod)中的Delt()來計算返回值,而不是你的'function(x)'。我可以問我該怎麼做? – pidosaurus