递归计算每个组内连续记录之间的差异

时间:2017-12-07 11:32:29

标签: r group-by difference

Goodmorning StackOverflow,

我已经看到类似问题的答案,但是,他们不考虑group_ID,并且不足以在大量数据集上运行。

我正在努力寻找以下任务的解决方案: 每个group_ID的连续元素,递归计算difference,其中上一个元素从第二个开始属于该group_ID的最后一个元素。

因此,考虑以下样本数据:

data <- data.frame(time = c(1:3, 1:4),
                   group_ID = c(rep(c("1", "2"), c(3, 4))),
                   value = c(0, 400, 2000, 0, 500, 2000, 2120))

我想找到的解决方案的预期结果是:

solution_df <- data.frame(time = c(1:3, 1:4),
                          group_ID = c(rep(c("1", "2"), c(3, 4))),
                          difference = c(NA, 400, 1600, NA, 500, 1500, 120))

至关重要的是要记住,数据集非常庞大,解决方案必须高效。

我希望问题很清楚,否则请询问进一步的细节。

1 个答案:

答案 0 :(得分:1)

您可以使用data.table进行分组,使用diff来计算差异。

library(data.table)
setDT(data)
data[, .(time = time,
  difference = c(NA, diff(value))), by = group_ID]

#   group_ID time difference
#1:        1    1         NA
#2:        1    2        400
#3:        1    3       1600
#4:        2    1         NA
#5:        2    2        500
#6:        2    3       1500
#7:        2    4        120

我不知道这里应该递归什么。