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