我有以下数据框架,我需要计算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行,因此上面的代码非常慢。
必须有更好的方法来做到这一点。将不胜感激任何帮助。
答案 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]