季度年增长率

Wol*_*olf 16 r

我一直在努力计算第一季度从第一年到第一季度的增长率.
在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)
Run Code Online (Sandbox Code Playgroud)

哪个会生成这个数据框:

    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
Run Code Online (Sandbox Code Playgroud)

eip*_*i10 14

这是使用dplyr包的选项:

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

library(dplyr)  
library(lubridate)
Run Code Online (Sandbox Code Playgroud)

在下面的代码中,我们首先按月分组,这允许我们分别在每个季度进行操作.该arrange功能只是确保每个季度内的数据按日期排序.然后我们添加yearOverYear使用的列来mutate计算每个季度当前年份与上一年度的比率.

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  
Run Code Online (Sandbox Code Playgroud)

如果您希望在添加年度值之后将数据框恢复为整体日期顺序:

df = df %>% group_by(month=month(date)) %>%
  arrange(date) %>%
  mutate(yearOverYear=value/lag(value,1)) %>%
  ungroup() %>% arrange(date)
Run Code Online (Sandbox Code Playgroud)

或使用 data.table

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


Car*_*bon 7

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

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
Run Code Online (Sandbox Code Playgroud)


bgo*_*dst 5

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
Run Code Online (Sandbox Code Playgroud)