рассчитать скорость по группам - PullRequest
0 голосов
/ 21 мая 2019

У меня есть данные, которые хотят рассчитать темп прироста за предыдущий год и квартал.

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

1 голос
/ 22 мая 2019

Итак, я вижу, что вы используете пакет 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"! Это отвечает на ваш вопрос?

0 голосов
/ 21 мая 2019

Я не знаком с пакетом 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
...