【发布时间】:2015-12-01 10:56:12
【问题描述】:
我有一个带有 key 和大约 1000 行的 data.table,其中两个设置为 key。我想创建一个名为 difference 的新变量,其中包含按键分组的每个数字行的差异。
比如简单的数据是:ID和Act设置为key
ID ValueDate Act Volume
1 2015-01-01 EUR 21
1 2015-02-01 EUR 22
1 2015-01-01 MAD 12
1 2015-02-01 MAD 11
2 2015-01-01 EUR 5
2 2015-02-01 EUR 7
3 2015-01-01 EUR 4
3 2015-02-01 EUR 2
3 2015-03-01 EUR 6
我想要的是:添加一个新列来计算每组两行之间的差异(按时间排序),注意对于每组的第一行,差异的值为0。
ID ValueDate Act Volume Difference
1 2015-01-01 EUR 21 0
1 2015-02-01 EUR 22 1
1 2015-01-01 MAD 12 0
1 2015-02-01 MAD 11 -1
2 2015-01-01 EUR 5 0
2 2015-02-01 EUR 7 2
3 2015-01-01 EUR 4 0
3 2015-02-01 EUR 2 -2
3 2015-03-01 EUR 6 4
这是生成测试数据的代码:
dd <- data.table(ID = c(1,1,1,1,2,2,3,3,3),
ValueDate = c("2015-01-01", "2015-02-01", "2015-01-01","2015-02-01", "2015-01-01","2015-02-01","2015-01-01","2015-02-01","2015-03-01"),
Act = c("EUR","EUR","MAD","MAD","EUR","EUR","EUR","EUR","EUR"),
Volume=c(21,22,12,11,5,7,4,2,6))
为表格设置键:
setkey(dd, ID, Act)
查看数据:
> dd
ID ValueDate Act Volume
1 1 2015-01-01 EUR 21
2 1 2015-02-01 EUR 22
3 1 2015-01-01 MAD 12
4 1 2015-02-01 MAD 11
5 2 2015-01-01 EUR 5
6 2 2015-02-01 EUR 7
7 3 2015-01-01 EUR 4
8 3 2015-02-01 EUR 2
9 3 2015-03-01 EUR 6
那么,我们可以使用聚合函数来计算差异吗?或 .SD 的“数据子集”的方法,但我不知道如何按组计算两行之间的差异,请注意,对于某些组,行数也可能不同,但我有之前尝试使用 for(i in 0:x) 重新计算差异,但我认为这不是一个好方法:(
【问题讨论】:
-
是否总是正好有两条记录?如果他们不是,你希望发生什么?
-
其实并不总是会有两条记录,这只是一个简单的例子,有些组有更多记录
标签: r data.table key grouping