连续计算复合回报

时间:2017-06-12 11:05:16

标签: r dataframe

我有以下数据框架,我需要计算3年内的复合回报。

2013     2014     2015     2016      Compound
21480    26384    166760   259842    12.1
104530   92259    80700    79434     0.76
28245    31614.7  29591.3  28557.1   1.01

最后一栏Compound是第三行的以下公式中2013-16数据的乘积:

(31614.7/28245) * (29591.3/31614.7) * (28557.7/29591.3) = 1.0111

以下是我的愚蠢代码:

CR <- rep(1,3); 
Compounding_Yrs <- 3;
Annual_Gwth <- data.frame(matrix(NA, nrow = 3, ncol = 3));
for(i in 1:nrow(dt)) 
for(j in 1:Compounding_Yrs) 
{
    Annual_Gwth[i,j]<-dt[i,j+1]/dt[i,j]; 
    CR[i]<-CR[i]*Annual_Gwth[i,j]
}

CR是最后一栏中的复合费率。我的数据集dt有超过100k行,因此上面的代码非常慢。

必须有更好的方法来做到这一点。将不胜感激任何帮助。

3 个答案:

答案 0 :(得分:0)

您所需要的就是将去年除以第一年。

E.g。在第3行:

> 28557.1/28245
[1] 1.01105

而且你不必遍历行。 R适用于矢量。

所以

dt[,4] / dt [,1]

将完成这项工作。

答案 1 :(得分:0)

您可以以矢量化方式一次完成所有操作(df是您的数据):

(df[,2]/df[,1])*(df[,3]/df[,2])*(df[,4]/df[,3])

答案 2 :(得分:0)

希望我没有提出错误的问题:

当您在T1和T2年之间进行复合时,解决方案可以归结为T2时的值/ T1时的值,因为中间项取消了。例如:

(31614.7 / 28245)*(29591.3 / 31614.7)*(28557.7 / 29591.3)= 1.0111

归结为: 28557.7 / 28245,因为其他条款取消。

所以我的简单解决方案是将第4列与第1列分开并将其记录在最后一列中。这也将处理可能出现在中间列中的任何0(由于缺少数据等):

DF[,5] <- DF[,4] / DF[,1]