我有一个数据想要计算上一年和上季度的增长率。
# dt
yq A B
2013 Q1 35233684 270950851
2013 Q2 36235895 274194641
2013 Q3 36767497 275614372
2013 Q4 37273346 277125049
2014 Q1 37788578 278202677
2014 Q2 38674955 281025545
str(dt)
Classes ‘data.table’ and 'data.frame': 6 obs. of 3 variables:
$ yq : 'yearqtr' num 2013 Q1 2013 Q2 2013 Q3 2013 Q4 ...
$ A : int 35233684 36235895 36767497 37273346 37788578 38674955
$ B: int 270950851 274194641 275614372 277125049 278202677 281025545
- attr(*, ".internal.selfref")=<externalptr>
我使用的代码:
dt[, lapply(.SD, function(x)x/shift(x) - 1), .SDcols = 2:3, by = .(quarter(yq))]
quarter A B
1 NA NA
1 0.07251283 0.02676436
2 NA NA
2 0.06731060 0.02491261
3 NA NA
4 NA NA
我得到了结果;但是,我想要这样的格式:
我希望它保留列yq
并按年份和季度排序。
yq A B
2013 Q1 35233684 270950851
2013 Q2 36235895 274194641
2013 Q3 36767497 275614372
2013 Q4 37273346 277125049
2014 Q1 37788578 278202677
2014 Q2 38674955 281025545
yq A B A_R B_R
2013 Q1 35233684 270950851 NA NA
2013 Q2 36235895 274194641 NA NA
2013 Q3 36767497 275614372 NA NA
2013 Q4 37273346 277125049 NA NA
2014 Q1 37788578 278202677 0.07251283 0.02676436
2014 Q2 38674955 281025545 0.06731060 0.02491261
如何编辑代码?
# Data
library(data.table)
dt <- fread("yq A B
2013 Q1 35233684 270950851
2013 Q2 36235895 274194641
2013 Q3 36767497 275614372
2013 Q4 37273346 277125049
2014 Q1 37788578 278202677
2014 Q2 38674955 28102554", header = T)
答案 0 :(得分:1)
所以我看到您正在使用zoo
包和函数yearqtr
。我无法使用您的yq
来读取fread
列,但我只是迅速地复制了数据,如下所示:
library(zoo)
dt<-data.table(cbind(yq=2013 + seq(0,5)/4,
A = c(35233684, 36235895, 36767497, 37273346, 37788578, 38674955),
B = c(270950851, 274194641, 275614372, 277125049, 278202677, 281025545)))
然后将yq转换如下:
dt[,yq:=as.yearqtr(yq)]
现在,如果要保留该列,则需要通过指定它们来更新这些列:
cols<-c("A","B")
dt[,eval(cols):=lapply(.SD,function(x)x/shift(x) - 1), .SDcols = 2:3, by = .(quarter(yq))]
因此,只需向cols
向量中添加任意数量的列,然后使用eval
,这样data.table
就不会创建名为“ cols”的新列!这能回答您的问题吗?
答案 1 :(得分:0)
我对data.table
软件包不熟悉。但是,这就是我使用dplyr
的方式。
您可以先将yq
列分成两列y
和q
。我跳过了代码中的这一步,因为我不知道您在原始数据中使用了哪种确切的数据类型。
然后按q
分组进行计算。
library(data.table)
dt <- fread(
"y q A B
2013 Q1 35233684 270950851
2013 Q2 36235895 274194641
2013 Q3 36767497 275614372
2013 Q4 37273346 277125049
2014 Q1 37788578 278202677
2014 Q2 38674955 281025545", header = T)
library(tidyverse)
dt%>%group_by(q)%>%
arrange(y)%>%
mutate(growth_rate_over_year_A= A/lag(A)-1,
growth_rate_over_year_B= B/lag(B)-1)%>%
ungroup
输出:
# A tibble: 6 x 6
y q A B growth_rate_over_year_A growth_rate_over_year_B
<int> <chr> <int> <int> <dbl> <dbl>
1 2013 Q1 35233684 270950851 NA NA
2 2013 Q2 36235895 274194641 NA NA
3 2013 Q3 36767497 275614372 NA NA
4 2013 Q4 37273346 277125049 NA NA
5 2014 Q1 37788578 278202677 0.0725 0.0268
6 2014 Q2 38674955 281025545 0.0673 0.0249