【发布时间】:2015-08-18 21:58:39
【问题描述】:
我有一张如下表:
id name amount year
001 A 10 2010
001 A 10 2011
001 A 12 2012
-----------------------
002 A 3 2012
002 A 4 2013
-----------------------
003 B 20 2011
003 B 20 2012
(注意两个实体名称相同 A 但它们不同,id 是唯一标识符。)
我想计算amount 与上一年相比的增量,即结果应如下所示:
id name increment year
001 A 0 2010
001 A 0 2011
001 A 2 2012
----------------------------
002 A 0 2012
002 A 1 2013
----------------------------
003 B 0 2011
003 B 0 2012
注意,第一年的增量被认为是“0”。
在MSSQL中,可以通过以下方式实现:
SELECT id,
name,
amount - LAG(amount, 1, amount) OVER (PARTITION BY id ORDER BY YEAR) as increment,
year
FROM table
我正在尝试使用 data.table 完成 R 中的任务。我找到了一个简洁的例子here:DT[, increment := amount - shift(amount, 1), by=id]。但是提示错误:could not find function "shift"。
版本是:
- R:3.2.0_1
- data.table: 1.9.4
问题是:
- 在data.table的Github上找到了
shift函数,为什么调用失败? - 我认为data.table中的
by相当于SQL中的PARTITION BY,那么R中ORDER BY的对应物是什么?在进行任何聚合之前是否必须设置 data.table 的键,以便对 data.table 进行排序?
【问题讨论】:
-
DT[, increment := c(0L, diff(amount)), by = id]。如果你想使用shift你需要从GH安装开发版本,见here -
使用
shift,会类似于DT[, increment := amount - shift(amount, 1L, fill = amount[1L]), by = id] -
用五种不同的方法查看这个问题stackoverflow.com/questions/30579699/…
-
@plafort 这个链接有什么关系?
-
是的,需要对年份进行排序以确保上一个条目与上一个年份相对应。如果您升级以获得 shift 功能,这样的事情应该可以工作:
DT[order(year), increment := amount - shift(amount, 1), by=id]这与您发布的代码几乎相同。如果您不升级(例如,我不能上班),David 在第一条评论中的回答也应该适用于插入的order。
标签: r data.table