在data.table中按组滚动操作

时间:2017-05-10 10:55:25

标签: r data.table

我想按小组对data.table行进行操作。

在下面的示例中,我希望在2017年获得每个values的{​​{1}},并从2014年的值中减去。解决方案不应涉及重塑数据。它必须创建一个新列,显示每个id的值在两年之间如何变化。

可重复的例子

id

预期产出:

library(data.table)

dt <- data.table( id=rep(letters[1:4],2),
                  values=c(11,22,33,44, 1,2,3,4),
                  year=c(rep(2014,4), rep(2017,4)))

#>  dt
#>     id values year
#>  1:  a     11 2014
#>  2:  b     22 2014
#>  3:  c     33 2014
#>  4:  d     44 2014
#>  5:  a      1 2017
#>  6:  b      2 2017
#>  7:  c      3 2017
#>  8:  d      4 2017

2 个答案:

答案 0 :(得分:4)

使用

这非常简单
dt[, result := values[year == 2014] - values[year == 2017], by = id]
#   id values year result
#1:  a     11 2014     10
#2:  b     22 2014     20
#3:  c     33 2014     30
#4:  d     44 2014     40
#5:  a      1 2017     10
#6:  b      2 2017     20
#7:  c      3 2017     30
#8:  d      4 2017     40

另一个选项(不太明确)是diff

dt[order(-year), result := diff(values), by = id]

答案 1 :(得分:2)

另一个选项是dplyr

library(dplyr)
dt %>% 
   group_by(id) %>%
   mutate(result = values[year == 2014] - values[year == 2017])