【问题标题】:compute rate by group按组计算速率
【发布时间】:2019-05-21 20:29:18
【问题描述】:

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

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

【问题讨论】:

  • 您能否以您正在使用的形式提供示例数据? dt 示例数据不使用与 dt 相同的 year-qtr 格式。
  • cols &lt;- c("A", "B") ; dt[, paste0(cols, "_R") := .SD / shift(.SD, 4) - 1, .SDcols = cols]

标签: r data.table data-manipulation


【解决方案1】:

所以我看到你正在使用zoo 包和函数yearqtr。我无法使用您的fread 读取yq 列,但我只是快速复制了如下数据:

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”的新列!这能回答你的问题吗?

【讨论】:

  • 是否可以保留原始列 AB 而无需替换它们?我在我的帖子中修改了
  • 我解决了。只是修改了一小部分。 dt[,eval(c("Anew" , "Bnew"):=lapply(.SD,function(x)x/shift(x) - 1), .SDcols = 2:3, by = .(quarter(yq))]
  • eval 中不需要。 c()(cols) 都可以使用
【解决方案2】:

我不熟悉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

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多