计算r中每季度长期数据的年增长率

时间:2015-11-11 14:39:04

标签: r dataframe

我的数据采用以下形式:

df <- data.frame(Sector=c(rep("A",8),rep("B",8)), Country = c(rep("USA", 16)),
                 Quarter=rep(1:8,2),Income=20:35)
df2 <- data.frame(Sector=c(rep("A",8),rep("B",8)), Country = c(rep("UK", 16)),
                 Quarter=rep(1:8,2),Income=32:47)
df <- rbind(df, df2)

我想要做的是计算从国家和行业内每年第一季度到第二年第一季度的增长率。在上面的例子中,它将是从第1季度到第5季度的增长率。因此对于A区域,在美国,它将是(24/20)-1 = 0.2

然后我想将这些数据作为新列追加到数据框中。

我看了解决方案: How calculate growth rate in long format data frame?

但如果滞后时间超过一个时间单位,那么就没有r技能可以让它发挥作用。有什么建议吗?

ADDITION

所以我想要的是增长率,即下例中的(24/20)-1 = 0.2。不是1-(24/20),这是我第一次写的。所需的输出应如下所示:

  Sector Country Quarter Income     growth
   (fctr)  (fctr)   (int)  (int)      (dbl)
1       A     USA       1     20    NA
2       A     USA       2     21    NA
3       A     USA       3     22    NA
4       A     USA       4     23    NA
5       A     USA       5     24    0.2
6       A     USA       6     25    0.1904
7       A     USA       7     26    0.1818

2 个答案:

答案 0 :(得分:1)

df3 = copy(df)
df3$Quarter = df3$Quarter - 4
df = merge(df,df3,c('Sector','Country','Quarter'), suffixes = c('','_prev'), all.x = T)
df$growth = 1 - (df$Income_prev/df$Income


> df
   Sector Country Quarter Income Income_prev growth
1       A     USA       1     20          24     -4
2       A     USA       2     21          25     -4
3       A     USA       3     22          26     -4
4       A     USA       4     23          27     -4
5       A     USA       5     24          NA     NA
6       A     USA       6     25          NA     NA
7       A     USA       7     26          NA     NA
8       A     USA       8     27          NA     NA
9       A      UK       1     32          36     -4
10      A      UK       2     33          37     -4
11      A      UK       3     34          38     -4
12      A      UK       4     35          39     -4
13      A      UK       5     36          NA     NA
14      A      UK       6     37          NA     NA
15      A      UK       7     38          NA     NA
16      A      UK       8     39          NA     NA
17      B     USA       1     28          32     -4
18      B     USA       2     29          33     -4
19      B     USA       3     30          34     -4
20      B     USA       4     31          35     -4
21      B     USA       5     32          NA     NA
22      B     USA       6     33          NA     NA
23      B     USA       7     34          NA     NA
24      B     USA       8     35          NA     NA
25      B      UK       1     40          44     -4
26      B      UK       2     41          45     -4
27      B      UK       3     42          46     -4
28      B      UK       4     43          47     -4
29      B      UK       5     44          NA     NA
30      B      UK       6     45          NA     NA
31      B      UK       7     46          NA     NA
32      B      UK       8     47          NA     NA
> 

答案 1 :(得分:0)

我认为你需要这样的东西:

library(dplyr)
df %>%
  #group by sector and country
  group_by(Sector, Country) %>%
  #calculate growth as (quarter / 5-period-lagged quarter) - 1
  mutate(growth = Income / lag(Income, 4) - 1)

输出

Source: local data frame [32 x 5]
Groups: Sector, Country [4]

   Sector Country Quarter Income    growth
   (fctr)  (fctr)   (int)  (int)     (dbl)
1       A     USA       1     20        NA
2       A     USA       2     21        NA
3       A     USA       3     22        NA
4       A     USA       4     23        NA
5       A     USA       5     24 0.2000000
6       A     USA       6     25 0.1904762
7       A     USA       7     26 0.1818182
8       A     USA       8     27 0.1739130
9       B     USA       1     28        NA
10      B     USA       2     29        NA
..    ...     ...     ...    ...       ...