按组计算时间的相对变化

Pat*_*ick 5 grouping r dataframe

我正在努力计算公司的年度净销售额之间的百分比差异,并考虑了NA。

这是数据示例:

dt <- data.table(lpermno = c(10065, 10065, 10065, 10065, 59328, 61241, 59328, 61241, 59328, 61241, 59328, 61241), fyear = c(2001, 2002, 2003, 2004, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004), sale = c(NA, NA, NA, NA, 26539, 3891.754, 26764, 2697.029, 30141, 3519.168, 34209, 5001.435))

lpermno fyear sale
10065   2001    NA
10065   2002    NA
10065   2003    NA
10065   2004    NA
59328   2001    26539.000
59328   2002    26764.000
59328   2003    30141.000
59328   2004    34209.000
61241   2001    3891.754
61241   2002    2697.029
61241   2003    3519.168
61241   2004    5001.435
Run Code Online (Sandbox Code Playgroud)

我想计算一个称为sales_change的新变量。此变量应为出售百分比变化。 [sale_n]/[sale_n-1] for each company. 对于公司的首次观察,sales_change只需为1。

我已阅读以下帖子以获取指导,但没有成功。

  1. 在R中按组计算第一差
    • 计算差异而不是百分比变化
  2. 按组和时间匹配计算值之间的差异
    • 调整代码后仅获取na的输出
  3. R:如何找到列之间的差异百分比并进行相应命名?
    • 这段代码返回了不同销售时期的新列,因为我工作了很多年,所以这不是可取的
  4. 计算R数据帧中的百分比变化
  5. 如何计算跨度不同的不同行的百分比变化
  6. 按组计算相对于基线的时间序列的相对变化。如果未测量基线值,则为NA
    • 使用基准,这不是我想要的
  7. dplyr按组/ id的滚动平均值(移动平均值)
    • 看起来是计算平均值的理想解决方案,但是我正在寻找百分比变化。

对于我上面给出的示例数据,所需的输出将是:

output <- data.table(lpermno = c(10065, 10065, 10065, 10065, 59328, 59328, 59328, 59328, 61241, 61241, 61241, 61241), fyear = c(2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004), sale = c(NA, NA, NA, NA, 3891.754, 2697.029, 3519.168, 5001.435, 26539, 26764, 30141, 34209), output = c(NA, NA, NA, NA, 1, 0.693011, 1.304831, 1.421198, 1, 1.008478, 1.126177, 1.134966))

lpermno fyear sale output
10065   2001    NA  NA
10065   2002    NA  NA
10065   2003    NA  NA
10065   2004    NA  NA
59328   2001    3891.754    1.000000
59328   2002    2697.029    0.693011
59328   2003    3519.168    1.304831
59328   2004    5001.435    1.421198
61241   2001    26539.000   1.000000
61241   2002    26764.000   1.008478
61241   2003    30141.000   1.126177
61241   2004    34209.000   1.134966
Run Code Online (Sandbox Code Playgroud)

我将不胜感激。提前致谢。

lmo*_*lmo 6

使用data.table,您可以执行以下操作:

dt[, pctchnge := sale / c(sale[1], head(sale, -1)), by="lpermno"][order(lpermno)]
Run Code Online (Sandbox Code Playgroud)

在此处,使用创建一个新变量:=,重复销售的第一个月,并在最后一个月的末尾放上尾号作为分母。由lpermno执行计算。然后按lpermno排序。

这回来

    lpermno fyear      sale  pctchnge
 1:   10065  2001        NA        NA
 2:   10065  2002        NA        NA
 3:   10065  2003        NA        NA
 4:   10065  2004        NA        NA
 5:   59328  2001 26539.000 1.0000000
 6:   59328  2002 26764.000 1.0084781
 7:   59328  2003 30141.000 1.1261770
 8:   59328  2004 34209.000 1.1349657
 9:   61241  2001  3891.754 1.0000000
10:   61241  2002  2697.029 0.6930112
11:   61241  2003  3519.168 1.3048314
12:   61241  2004  5001.435 1.4211981
Run Code Online (Sandbox Code Playgroud)