按组计算率

时间:2019-05-21 20:29:19

标签: r data.table data-manipulation

我有一个数据想要计算上一年和上季度的增长率。

# 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)

2 个答案:

答案 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列分成两列yq。我跳过了代码中的这一步,因为我不知道您在原始数据中使用了哪种确切的数据类型。 然后按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