如何按组在data.table中应用函数然后在新列中输出结果?

时间:2014-11-27 18:23:33

标签: r data.table

我的数据集如下所示:

Date<-rep(seq(as.Date("2000/1/1"), as.Date("2001/1/1"), by = "quarter"),2)
Name<-c(rep("a",5),rep("b",5))
Return<-rnorm(10,0,0.1)
dt<-data.table(Date,Name,Return)

并且样本采用以下形式:

    Date        Name   Return
 1: 2000-01-01    a  0.049675002
 2: 2000-04-01    a -0.017131607
 3: 2000-07-01    a  0.157891524
 4: 2000-10-01    a  0.112921428
 5: 2001-01-01    a  0.190409895
 6: 2000-01-01    b  0.001505096
 7: 2000-04-01    b -0.135364485
 8: 2000-07-01    b  0.050353871
 9: 2000-10-01    b  0.145750019
10: 2001-01-01    b  0.025039778

问题是数据表中的返回不是我想要的。我想要使​​用的数据应该是价格而不是回报。问题假设数据中第一个时期之前的价格是100,并且通过应用函数: P t = P t-1 *(1+ R < / strong> t)(t和t-1是此等式中的下标)我可以生成一个新的价格列。所以我希望我能得到以下内容:

    Date      Name  Return       Price
1   01/01/2000  a   0.049675002  104.9675002
2   01/04/2000  a   -0.017131607 103.1692383
3   01/07/2000  a   0.157891524  119.4587865
4   01/10/2000  a   0.112921428  132.9482432
5   01/01/2001  a   0.190409895  158.2629043
6   01/01/2000  b   0.001505096  100.1505096
7   01/04/2000  b   -0.135364485 86.59368745
8   01/07/2000  b   0.050353871  90.95401482
9   01/10/2000  b   0.145750019  104.2105642
10  01/01/2001  b   0.025039778  106.8199736

具体而言,困难是:

  1. 我需要在具有不同名称的组中应用它,真实数据有大约160个不同的名称。在每个名称下,我需要假设起始价格为P0 = 100(我们在价格系列中不需要这100个。

  2. 每个名称下的数据长度实际上是不同的,其中一些有100个观察值,而其他可能只有85个,每个名称下的数据长度都没有模式。

  3. 如何在编写公式时使用上一期间的价格来计算当前价格?我没有找到回顾之前观察的方式,因为Price [-1]不起作用。

  4. 非常感谢您的时间和提前帮助!!!

1 个答案:

答案 0 :(得分:5)

这是一种方式:

DT[,Price:=100*cumprod(1+Return),by=Name]
#           Date Name       Return     Price
#  1: 2000-01-01    a  0.049675002 104.96750
#  2: 2000-04-01    a -0.017131607 103.16924
#  3: 2000-07-01    a  0.157891524 119.45879
#  4: 2000-10-01    a  0.112921428 132.94824
#  5: 2001-01-01    a  0.190409895 158.26290
#  6: 2000-01-01    b  0.001505096 100.15051
#  7: 2000-04-01    b -0.135364485  86.59369
#  8: 2000-07-01    b  0.050353871  90.95401
#  9: 2000-10-01    b  0.145750019 104.21056
# 10: 2001-01-01    b  0.025039778 106.81997