数据结构如下...
df <- data.frame(Category=c(rep("A",6),rep("B",6)),
Year=rep(2010:2015,2),Value=1:12)
我很难在类别内创建增长率列(按年份)。任何人都可以帮助编写代码来创建这样的东西......
Category Year Value Growth
A 2010 1
A 2011 2 1.000
A 2012 3 0.500
A 2013 4 0.333
A 2014 5 0.250
A 2015 6 0.200
B 2010 7
B 2011 8 0.143
B 2012 9 0.125
B 2013 10 0.111
B 2014 11 0.100
B 2015 12 0.091
最佳答案
对于这类问题(“我如何按类别 YYY 计算 XXX”)?总有基于by()
的解决方案, data.table()
包,和 plyr
.我一般更喜欢 plyr
,这通常更慢,但(对我来说)更透明/优雅。
df <- data.frame(Category=c(rep("A",6),rep("B",6)),
Year=rep(2010:2015,2),Value=1:12)
library(plyr)
ddply(df,"Category",transform,
Growth=c(NA,exp(diff(log(Value)))-1))
这个答案与@krlmr 的主要区别在于,我使用的是几何平均技巧(取对数的差异然后取幂),而@krlmr 计算显式比率。
数学上,
diff(log(Value))
正在获取日志的差异,即 log(x[t+1])-log(x[t])
所有 t
.当我们取幂时,我们得到比率 x[t+1]/x[t]
(因为 exp(log(x[t+1])-log(x[t])) = exp(log(x[t+1]))/exp(log(x[t])) = x[t+1]/x[t]
)。 OP 想要分数变化而不是乘法增长率(即 x[t+1]==x[t]
对应于零的分数变化而不是乘法增长率 1.0),所以我们减去 1。我也在用
transform()
需要一点额外的“语法糖”,以避免创建新的匿名函数。
关于r - 如何计算长格式数据帧的增长率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824601/