【问题标题】:Calculating yearly growth-rates from quarterly, long form data in r从 r 中的季度长格式数据计算年增长率
【发布时间】:2015-11-11 14:39:03
【问题描述】:

我的数据采用以下形式:

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-skills 让它工作。有什么建议吗?

添加

所以我想要的是增长率,即下例中的 (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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    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
    ..    ...     ...     ...    ...       ...
    

    【讨论】:

    • 谢谢,但这不是我想要的。除了将丢失的第一个季度外,我希望从 t-4 计算每行的唯一增长率。请看我的补充!在原帖中!
    • 我现在尝试了我的真实数据,它就像一个魅力。非常优雅的解决方案。不过,在问题上,我对运算符 %>% 并不熟悉,而且它非常不适合谷歌。它有什么作用?
    • 很高兴听到这个消息:)。谢谢!
    • 它来自magrittr 包。它允许以更清晰的方式表示嵌套函数。 %&gt;% 左侧的对象作为第一个参数传递给右侧的函数。输入help('%&gt;%'),有一个全面的例子和描述。
    【解决方案2】:
    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
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多