【问题标题】:Quarterly Year over Year Growth Rate季度同比增长率
【发布时间】:2015-08-21 02:48:18
【问题描述】:

我一直在尝试计算将第一季度从一年到第二年第一季度的增长率。
在 Excel 中,公式如下所示 ((B6-B2)/B2)*100。

在 R 中实现此目的的最佳方法是什么?我知道如何获得不同时期的差异,但无法通过 4 个时期的差异来完成。

代码如下:

date <- c("2000-01-01","2000-04-01", "2000-07-01",
          "2000-10-01","2001-01-01","2001-04-01",
          "2001-07-01","2001-10-01","2002-01-01",
          "2002-04-01","2002-07-01","2002-10-01")
value <- c(1592,1825,1769,1909,2022,2287,2169,2366,2001,2087,2099,2258)
df <- data.frame(date,value)

这将产生这个数据框:

    date       value
1   2000-01-01  1592
2   2000-04-01  1825
3   2000-07-01  1769
4   2000-10-01  1909
5   2001-01-01  2022
6   2001-04-01  2287
7   2001-07-01  2169
8   2001-10-01  2366
9   2002-01-01  2001
10  2002-04-01  2087
11  2002-07-01  2099
12  2002-10-01  2258

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个使用 dplyr 包的选项:

    # Convert date column to date format
    df$date = as.POSIXct(df$date)
    
    library(dplyr)  
    library(lubridate)
    

    在下面的代码中,我们首先按月分组,这样我们就可以分别对每个季度进行操作。 arrange 函数只是确保每个季度内的数据按日期排序。然后我们使用mutate 添加yearOverYear 列,该列计算每个季度的当年与上一年的比率。

    df = df %>% group_by(month=month(date)) %>%
      arrange(date) %>%
      mutate(yearOverYear=value/lag(value,1))
    
             date value month yearOverYear
    1  2000-01-01  1592     1           NA
    2  2001-01-01  2022     1    1.2701005
    3  2002-01-01  2001     1    0.9896142
    4  2000-04-01  1825     4           NA
    5  2001-04-01  2287     4    1.2531507
    6  2002-04-01  2087     4    0.9125492
    7  2000-07-01  1769     7           NA
    8  2001-07-01  2169     7    1.2261164
    9  2002-07-01  2099     7    0.9677271
    10 2000-10-01  1909    10           NA
    11 2001-10-01  2366    10    1.2393924
    12 2002-10-01  2258    10    0.9543533  
    

    如果您希望在添加同比值后将数据框恢复为总体日期顺序:

    df = df %>% group_by(month=month(date)) %>%
      arrange(date) %>%
      mutate(yearOverYear=value/lag(value,1)) %>%
      ungroup() %>% arrange(date)
    

    或使用data.table

    library(data.table) # v1.9.5+
    setDT(df)[, .(date, yoy = (value-shift(value))/shift(value)*100), 
                by = month(date)
            ][order(date)]
    

    【讨论】:

    • 感谢您的回答!非常感谢。
    • 我猜你要写arrange(month)?因为arrange(date) 没有给我图示的输出,而arrange(month) 正好在上面产生。
    【解决方案2】:

    这是一个非常简单的解决方案:

    YearOverYear<-function (x,periodsPerYear){
        if(NROW(x)<=periodsPerYear){
            stop("too few rows")
        }
        else{
            indexes<-1:(NROW(x)-periodsPerYear)
            return(c(rep(NA,periodsPerYear),(x[indexes+periodsPerYear]-x[indexes])/x[indexes]))
        }
    }
    
    
    > cbind(df,YoY=YearOverYear(df$value,4))
             date value         YoY
    1  2000-01-01  1592          NA
    2  2000-04-01  1825          NA
    3  2000-07-01  1769          NA
    4  2000-10-01  1909          NA
    5  2001-01-01  2022  0.27010050
    6  2001-04-01  2287  0.25315068
    7  2001-07-01  2169  0.22611645
    8  2001-10-01  2366  0.23939235
    9  2002-01-01  2001 -0.01038576
    10 2002-04-01  2087 -0.08745081
    11 2002-07-01  2099 -0.03227294
    12 2002-10-01  2258 -0.04564666
    

    【讨论】:

      【解决方案3】:
      df$yoy <- c(rep(NA,4),(df$value[5:nrow(df)]-df$value[1:(nrow(df)-4)])/df$value[1:(nrow(df)-4)]*100);
      df;
      ##          date value       yoy
      ## 1  2000-01-01  1592        NA
      ## 2  2000-04-01  1825        NA
      ## 3  2000-07-01  1769        NA
      ## 4  2000-10-01  1909        NA
      ## 5  2001-01-01  2022 27.010050
      ## 6  2001-04-01  2287 25.315068
      ## 7  2001-07-01  2169 22.611645
      ## 8  2001-10-01  2366 23.939235
      ## 9  2002-01-01  2001 -1.038576
      ## 10 2002-04-01  2087 -8.745081
      ## 11 2002-07-01  2099 -3.227294
      ## 12 2002-10-01  2258 -4.564666
      

      【讨论】:

      • 非常感谢。非常简单的方法!
      【解决方案4】:

      另一个基础 R 解决方案。要求日期为日期格式,以便将常用月份作为分组变量传递给计算增长率的函数

      # set date to a date objwct
      df$date <- as.Date(df$date)
      
      # order by date
      df <- df[order(df$date), ]
      
      # function to calculate differences
      f <- function(x) c(NA, 100*diff(x)/x[-length(x)])
      
      df$yoy <- ave(df$value, format(df$date, "%m"), FUN=f)
      #          date value       yoy
      # 1  2000-01-01  1592        NA
      # 2  2000-04-01  1825        NA
      # 3  2000-07-01  1769        NA
      # 4  2000-10-01  1909        NA
      # 5  2001-01-01  2022 27.010050
      # 6  2001-04-01  2287 25.315068
      # 7  2001-07-01  2169 22.611645
      # 8  2001-10-01  2366 23.939235
      # 9  2002-01-01  2001 -1.038576
      # 10 2002-04-01  2087 -8.745081
      # 11 2002-07-01  2099 -3.227294
      # 12 2002-10-01  2258 -4.564666
      

      c(rep(NA, 4,), 100* diff(df$value, lag=4) / head(df$value, -4))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多