首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有更快的方法来获得百分比变化?

有没有更快的方法来获得百分比变化?
EN

Stack Overflow用户
提问于 2011-10-24 03:13:40
回答 2查看 913关注 0票数 1

我有一个大约有25000条记录和10列的数据框架。我正在使用代码来确定对同一列(NewVal)中前一个值的更改,该更改基于另一个列(y),其中已有百分比更改。

代码语言:javascript
运行
复制
x=c(1:25000)
y=rpois(25000,2)
z=data.frame(x,y)
z[1,'NewVal']=z[1,'x']

所以我运行了这个:

代码语言:javascript
运行
复制
for(i in 2:nrow(z)){z$NewVal[i]=z$NewVal[i-1]+(z$NewVal[i-1]*(z$y[i]/100))}

这花费的时间比我预期的要长得多。诚然,我可能是一个不耐烦的人--就像一封写给我的尖刻信件所说的那样--但我正试图逃离Excel的世界(在我阅读了http://www.burns-stat.com/pages/Tutor/spreadsheet_addiction.html之后,它给我带来了更多问题,因为我开始不信任数据--那封信还提到了我的信任问题)。

我想在不使用包中的任何函数的情况下这样做,因为我想知道创建值的公式是什么-或者如果你愿意的话,根据这封友好的信件,我是一个苛刻的控制狂。

我还想知道如何获得移动平均值,就像caTools中的滚动平均一样。要么这样,要么我怎么知道他们的公式是什么?我试着输入rollmean,我想它引用了另一个函数(我是R的新手)。这可能是另一个问题--但正如那封信所说,我一生中从来没有做出过正确的决定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 03:40:22

R中的秘诀是矢量化。在您的示例中,您可以使用cumprod来完成繁重的任务:

代码语言:javascript
运行
复制
z$NewVal2 <- x[1] * cumprod(with(z, 1 +(c(0, y[-1]/100))))

all.equal(z$NewVal, z$NewVal2)
[1] TRUE

head(z, 10)
    x y   NewVal  NewVal2
1  25 4 25.00000 25.00000
2  24 3 25.75000 25.75000
3  23 0 25.75000 25.75000
4  22 1 26.00750 26.00750
5  21 3 26.78773 26.78773
6  20 2 27.32348 27.32348
7  19 2 27.86995 27.86995
8  18 3 28.70605 28.70605
9  17 4 29.85429 29.85429
10 16 2 30.45138 30.45138

在我的机器上,循环运行时间不到3分钟,而cumprod语句几乎是即时的。

票数 7
EN

Stack Overflow用户

发布于 2011-10-24 04:48:18

我使用Reduce获得了大约800倍的性能提升

代码语言:javascript
运行
复制
    system.time(z[, "NewVal"] <-Reduce("*",  c(1, 1+z$y[-1]/100), accumulate=T) )
   user  system elapsed 
  0.139   0.008   0.148 

> head(z)
    x y NewVal
1   1 1  1.000
2   2 1  1.010
3   3 1  1.020
4   4 5  1.071
5   5 1  1.082
6   6 2  1.103
7   7 2  1.126
8   8 3  1.159
9   9 0  1.159
10 10 1  1.171
> system.time(for(i in 2:nrow(z)){z$NewVal[i]=z$NewVal[i-1]+
                                              (z$NewVal[i-1]*(z$y[i]/100))})
   user  system elapsed 
  37.29  106.38  143.16 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7868484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档