代码之家  ›  专栏  ›  技术社区  ›  Zmnako Awrahman beloncfy

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

  •  2
  • Zmnako Awrahman beloncfy  · 技术社区  · 7 年前

    我想得到一个季度与去年同期的百分比差异。 这是我的 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 <- 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 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    我们可以通过提取四分之一部分,然后使用 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)
    
        2
  •  0
  •   G. Grothendieck    7 年前

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