Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组计算比率_R_Data.table_Data Manipulation - Fatal编程技术网

R 按组计算比率

R 按组计算比率,r,data.table,data-manipulation,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’ a

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

# 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> 
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
我得到了结果;但是,我希望格式如下:
我希望它保留列
yq
,并按年度和季度排序

# 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> 
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我不熟悉
数据表。但下面是我将如何使用
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
库(data.table)
dt%组_按(q)%>%
排列(y)%>%
突变(年增长率=A/滞后(A)-1,
年增长率=B/滞后(B)-1%>%
解组
输出:

# 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
#一个tible:6 x 6
y q A B年增长率年增长率
2013年第一季度35233684 270950851不适用
2013年第2季度36235895 274194641不适用
2013年第3季度36767497 275614372不适用
4 2013年第4季度37273346 277125049北美
5 2014年第一季度37788578 278202677 0.0725 0.0268
2014年第6季度38674955 281025545 0.0673 0.0249

因此我看到您正在使用
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)))
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能否以您正在使用的形式提供示例数据?
dt
示例数据与您的
dt
cols使用的年份qtr格式不同。是否可以保留原始列
A
B
,而不替换它们?我修改了我的职位。只是修改了一小部分
dt[,eval(c(“new”,“Bnew”):=lapply(.SD,function(x)x/shift(x)-1),.SDcols=2:3,by=(quarter(yq))
不需要
eval
。这两种方法都可以工作