r - 如何计算长格式数据帧的增长率?

标签 r math dataframe

数据结构如下...

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/

相关文章:

r - 将 PDF 嵌入 Shiny 的应用程序

javascript - R - 如何使用 as.POSIXct 将 JavaScript 时间戳转换为人类日期时间?

r - 为使用 map() 创建的 ggplots 添加标题

dataframe - 可在 Julia 的多个列中进行透视

python - 关联表的列到行

R:从 ggplot 对象中提取比例名称

function - 为什么没有类似于atan2()的asin2()和acos2()函数?

algorithm - 将地球划分为固定区域的算法。然后算法查看给定纬度、经度和半径重叠的区域

c++ - C++ 中具有多个(不相关?)分布的随机生成器

r - 在 R 数据框中查找整行?