季度年增长率

时间:2015-06-06 03:24:45

标签: 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)

将生成此数据框:

    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

4 个答案:

答案 0 :(得分:14)

这是使用dplyr包的选项:

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

library(dplyr)  
library(lubridate)

在下面的代码中,我们首先按月分组,这样我们就可以分别在每个季度进行操作。 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  

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

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)]

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:2)

另一个基础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))