我有一个简单的时间序列数据集,有10个变量-我想创建一个for循环(或函数),为时间序列中的每个变量(除了日期)创建一个“与上个月的变化”变量和“与上个月的百分比变化”变量。我知道我可以简单地为每个特定的列编写代码,但我想优化它,因为有很多列。
下面是我的数据的样子,“日期”,“销售额”,“价格”是一些列名:
+----+---+---+---+---+---+---+---+--
| Date | Sales | Price |
+----+---+---+---+---+---+---+---+--
| 01Aug2019 | 4 | 15 |
| 01Sept2019 | 6 | 30 |
| 01Oct2019 | 10 | 44 |
+----+---+---+---+---+---+---+---+--
下面是我希望使用for循环(或任何函数)后的效果
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Date | Sales | chg_Sales | pct_chg_Sales | Price | chg_Price | pct_chg_Price|
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 01Aug2019 | 4 | NA |NA | 15 | NA |NA |
| 01Sept2019 | 6 | 2 |50% | 30 | 15 |100% |
| 01Oct2019 | 10 | 4 |66% | 44 | 14 |46% |
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
我尝试了下面的代码,但它不工作
add_column <- function (x, y){
setDT (x)[,pct_chg_y:= (y - shift (y,1, type="lag")/shift (,1, type="lag")*100]
}
2条答案
按热度按时间qf9go6mv1#
下面是
data.table
的一个选项,我们在.SDcols
中指定感兴趣的列,通过从lag
中减去.SD
(数据表的子集)(即.SD
的shift
)来创建“chg_”列,然后在第二步中,通过使用Map
将shift
除以“chg_”列来创建“pct_chg数据
agxfikkp2#