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

时间:2017-11-27 12:25:30

标签: r division calculated-columns

我希望在一个季度与一年前同一季度相比获得百分比差异。 这是我的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)
)

2 个答案:

答案 0 :(得分:1)

我们可以通过提取季度部分然后使用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)

答案 1 :(得分:0)

对于时间序列数据,如果您首先使用时间序列类,则这些操作会更容易。首先创建一个动物园对象z,其时间索引为"yearqtr",然后使用diff.zoo创建返回ret。可以使用fortify.zoo(ret)将其转换回数据框,但可能没有必要。最后,我们使用autoplot.zoo创建一个返回的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()

enter image description here