2013-10-18 67 views
2

我目前工作的一個data.table(myDT)與如下因素3列:計算市場份額中的R

TRADE_DATE TRADER VOLUME 
01-MAY-2013 T1 100 
01-MAY-2013 T2 200 
01-MAY-2013 T3 500 
01-MAY-2013 T4 200 
02-MAY-2013 T1 400 
02-MAY-2013 T2 500 
02-MAY-2013 T3 50 
02-MAY-2013 T4 50 

我想找到一種方法來計算每一個交易量的份額天。目前我正在計算每天的總量,然後與前一個表合併,以計算每位交易員每天的市場份額。有沒有一種更直接的方式與data.tables做到這一點?

我重視herunder我的代碼:

daylyVolume<-myDT[,list(DAILY_VOLUME=sum(VOLUME)),by="TRADE_DATE"] 
    myDT<-merge(myDT,daylyVolume,all=TRUE,by='TRADE_DATE') 
    myDT$"SHARE_VOLUME"<-100*myDT$"VOLUME"/myDT$"DAILY_VOLUME" 

結果如下:

TRADE_DATE TRADER VOLUME SHARE DAYLY_VOLUME 
01-MAY-2013 T1 100  10  1000 
01-MAY-2013 T2 200  20  1000 
01-MAY-2013 T3 500  50  1000 
01-MAY-2013 T4 200  20  1000 
02-MAY-2013 T1 400  40  1000 
02-MAY-2013 T2 500  50  1000 
02-MAY-2013 T3 50  5  1000 
02-MAY-2013 T4 50  5  1000 
+0

您可以添加示例數據以使您的示例具有可重現性嗎? – juba

回答

2

的簡單方法是做到這一點:

dt[,list(VOLUME,DAILY_VOLUME=sum(VOLUME),SHARE=VOLUME/sum(VOLUME)*100),by="TRADE_DATE"] 

    TRADE_DATE VOLUME DAILY_VOLUME SHARE 
1: 01-MAY-2013 100   1000 10 
2: 01-MAY-2013 200   1000 20 
3: 01-MAY-2013 500   1000 50 
4: 01-MAY-2013 200   1000 20 
5: 02-MAY-2013 400   1000 40 
6: 02-MAY-2013 500   1000 50 
7: 02-MAY-2013  50   1000  5 
8: 02-MAY-2013  50   1000  5 

更有效的方式,如果你只是想計算份額,是:

R> dt[,SHARE:=VOLUME/sum(VOLUME)*100,by="TRADE_DATE"] 
R> dt 

    TRADE_DATE TRADER VOLUME SHARE 
1: 01-MAY-2013  T1 100 10 
2: 01-MAY-2013  T2 200 20 
3: 01-MAY-2013  T3 500 50 
4: 01-MAY-2013  T4 200 20 
5: 02-MAY-2013  T1 400 40 
6: 02-MAY-2013  T2 500 50 
7: 02-MAY-2013  T3  50  5 
8: 02-MAY-2013  T4  50  5 
1

你要嗎?

myDT[,list(share= VOLUME/sum(VOLUME)*100),by="TRADE_DATE"]