我有一个数据框,我想每隔三行添加一次。然后,将cumprod应用于行,以便使用新的data.frame以及生成的新行。

最后,我将只有行数的三分之一。

在下面,您可以找到我编写的一些代码。我试图寻找对象的类,并复制适用于矢量而不是矩阵的代码。

    XYZ<-read.xlsx2("XYZ.xlsx",1)
    XYZ.CUT<-aggregate(XYZ~gl(nrow(XYZ)/3, 3), data.frame(XYZ), sum)
    F.XYZ<-apply(t(XYZ.CUT+1),1,cumprod)

这就是我所拥有的:
 X       Y      Z
-0,01%   0,32%  0,11%
-0,04%   0,01%  0,45%
-0,11%  -0,06%  0,03%
 0,03%  -0,04%  0,45%
 0,02%   0,04%  0,30%
-0,07%  -0,11%  0,11%
-0,12%  -0,13%  0,30%
-0,01%  -0,07%  0,04%
-0,37%   0,08%  0,05%

首先我要:
 X       Y      Z
-0,16%   0,25%  0,59%
-0,02%  -0,11%  0,86%
-0,50%  -0,12%  0,39%

在每个元素上加1之后:
 X           Y           Z
(1-0,16%)   (1+0,25%)   (1+0,59%)
(1-0,02%)   (1-0,11%)   (1+0,86%)
(1-0,50%)   (1-0,12%)   (1+0,39%)

我想用行做一个cumprod:
X           Y           Z
x1          y1          z1
x1*x2       y1*y2       z1*z2
x1*x2*x3    y1*y2*y3    z1*z2*z3

高级问候语。

最佳答案

我们可以仅使用基数R通过以下方式进行操作:

#First remove the % symbol from the columns and convert the values to numeric
XYZ[] <- lapply(XYZ, function(x) as.numeric(sub("%", "", x)))

#Sum every 3 rows
XYZ.CUT <- aggregate(.~ gl(nrow(XYZ)/3, 3),XYZ, sum)[-1]

#Add 1 and take cumulative product for each row
t(apply(XYZ.CUT + 1, 1, cumprod))
#Or if you need it columnwise use
#apply(XYZ.CUT + 1, 2, cumprod)
#        X      Y        Z
#[1,] 0.84 1.0668 1.696212
#[2,] 0.98 0.8722 1.622292
#[3,] 0.50 0.4400 0.611600

07-24 14:24