使用R中的“shift”函数按组从另一行中减去一行

时间:2018-05-21 17:00:54

标签: r

我有一个看起来像这样的data.table:

dt
   id month balance
1:  1     4     100
2:  1     5      50
3:  2     4     200
4:  2     5     135
5:  3     4     100
6:  3     5     100
7:  4     5     300

“id”是客户的ID,“month”表示它是什么月份,“balance”表示客户的帐户余额。从某种意义上说,这是纵向数据,例如,元素(2,3)表示客户#1在月末5的帐户余额为50。

我想生成一个专栏,让我了解客户在第5个月和第4个月之间的余额,以了解从一个月到另一个月进行的交易。

这个新变量应该让我知道客户1吸引了50,客户2吸引了65,而客户3在4月和5月之间没有做总计的任何事情。客户4是加入may的新客户。

我想到了以下代码:

dt$transactions <- dt$balance - shift(dt$balance, 1, "up")

然而,它无法正常工作,因为它告诉我客户4存入了200美元(但客户4是新的!)。因此,我希望能够以某种方式将“by = id”这个参数引入。

我知道解决方案在于使用以下符号:

dt[, transactions := balance - shift(balance, ??? ), by=id]

我只需要弄清楚如何使上述代码正常工作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

鉴于我只有两个观察结果(最多),以下代码为我提供了一个优雅的解决方案:

AutoSize

这可以防止任何NA进入变量事务

但是,如果每个id有更多的观察,我会做以下事情:

dt[, transaction := balance - first(balance), by = id]

非常感谢@Ryan和@Onyambu的帮助。