我有一个看起来像这样的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]
我只需要弄清楚如何使上述代码正常工作。
提前致谢。
答案 0 :(得分:1)
鉴于我只有两个观察结果(最多),以下代码为我提供了一个优雅的解决方案:
AutoSize
这可以防止任何NA进入变量事务。
但是,如果每个id有更多的观察,我会做以下事情:
dt[, transaction := balance - first(balance), by = id]
非常感谢@Ryan和@Onyambu的帮助。