【问题标题】:Last observation of the previous group上一组的最后一次观察
【发布时间】:2020-01-27 16:09:26
【问题描述】:

我想知道,如果我有可以按变量分组的数据,我怎样才能得到前一组的最后一次观察?

我有以下数据:

dt <- data.table(a=c(1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,5,5,5,5,5), b=sample.int(21))

我想创建一个新的 data.table,其中包含组 ID 以及该组的最后一次观察与前一组的最后一次观察之间的差异。所以从上面我会得到:

   a  c
1: 1 NA
2: 2  9
3: 3  1
4: 4 -8
5: 5  5

谢谢!

【问题讨论】:

  • 请务必使用set.seed 以使其可重现

标签: r data.table


【解决方案1】:

我们按'a'分组,得到'b'的last元素,然后通过shifting取'c'的lag

dt[, .(c = last(b)), a][,  c:= shift(c)][]

【讨论】:

  • 这种方式应该很有效,因为将使用glast(GForce的一部分)。
【解决方案2】:

这是一种方法:

dt[, c := b * (1:.N == .N), by = a] ## get last row within the group
dt <- dt[b == c] ## filter data.table to get rows of interest
dt[, c := shift(c, type = "lag") - c][] ## getting difference using shift with lag argument

#   a  b  c
#1: 1 11 NA
#2: 2 10 NA
#3: 3 18  9
#4: 4 19 -7
#5: 5 12 -8

数据

set.seed(1)
dt <- data.table(a=c(1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,5,5,5,5,5), b=sample.int(21))

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2021-06-27
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多