创建新列:将当年季度除以去年季度减 1

Create new column: divides current year quarter by last year quarter minus 1

我想获得一个季度与去年同期相比的百分比差异。 这是我的 df

df <- data.frame(
  x0 = c('2010Q1', '2010Q2', '2010Q3', '2010Q4', '2011Q1', '2011Q2', 
         '2011Q3', '2011Q4', '2012Q1', '2012Q2', '2012Q3', '2012Q4', 
         '2013Q1', '2013Q2', '2013Q3', '2013Q4', '2014Q1', '2014Q2'),
  x1 = c(14.0, 13.4, 13.8, 14.4, 14.2, 14.3, 14.0, 14.1, 14.6, 14.3, 
         14.0, 13.6, 13.5, 12.9, 13.2, 13.2,12.7, 13.6),
  x2 = c(13.0, 13.3, 13.4, 13.7, 13.7, 13.9, 14.0, 13.9, 13.9, 14.0, 
         14.1, 13.8, 13.7, 13.8, 13.8, 13.8, 13.6, 13.9)
)

我想计算 2012Q1 / 2011Q1 minus 1,以及剩余的季度。获得如下所示的 df

df <- data.frame(
   x0 = c('2010Q1', '2010Q2', '2010Q3', '2010Q4', '2011Q1', '2011Q2', 
          '2011Q3', '2011Q4', '2012Q1', '2012Q2', '2012Q3', '2012Q4', 
          '2013Q1', '2013Q2', '2013Q3', '2013Q4', '2014Q1', '2014Q2'),
   x1 = c(14.0, 13.4, 13.8, 14.4, 14.2, 14.3, 14.0, 14.1, 14.6, 14.3, 
          14.0, 13.6, 13.5, 12.9, 13.2, 13.2,12.7, 13.6),
   x1_div = c(NA, NA, NA, NA, 0.018, 0.063, 0.009, -0.015, 0.031, 
              0.002, 0.004, -0.036, -0.081, -0.099, -0.059, -0.031, 
             -0.054, 0.057),
   x2 = c(13.0, 13.3, 13.4, 13.7, 13.7, 13.9, 14.0, 13.9, 13.9, 14.0, 
          14.1, 13.8, 13.7, 13.8, 13.8, 13.8, 13.6, 13.9),
   x2_div = c(NA, NA, NA, NA, 0.058, 0.051, 0.044, 0.013, 0.008, 0.006, 
              0.004, -0.008, -0.012, -0.017, -0.016, -0.005, -0.005, 
              0.007)
)

我们可以通过提取四分之一部分然后使用 mutate_at 来创建分组列,将列的 lag 除以列值并从 1 中减去。

library(dplyr)
library(stringr)
df %>%
    group_by(grp = str_extract(x0, "Q\d")) %>% 
    mutate_at(vars('x1', 'x2'), funs(div = round(1- lag(.)/., 2))) %>%
    ungroup %>%
    select(-grp)

对于时间序列数据,如果您首先使用时间序列 class,这些操作会更容易。首先创建一个动物园对象 z,具有 "yearqtr" 时间索引,然后使用 diff.zoo 创建 returns、ret。这可以使用 fortify.zoo(ret) 转换回数据框,但可能不是必需的。最后,我们使用 autoplot.zoo 创建 returns 的 ggplot2 图作为进一步处理的示例。 (删除 facet=NULL 以获得多面板图。)

library(zoo)

z <- read.zoo(df, FUN = as.yearqtr)
ret <- diff(z, 4, arithmetic = FALSE) - 1

library(ggplot2)
autoplot(ret, facet = NULL) + scale_x_yearqtr()