创建新列:将当年季度除以去年季度减 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()
我想获得一个季度与去年同期相比的百分比差异。
这是我的 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()