【问题标题】:How to create a time lag of a column of dates by another sorted column using the data.table package?如何使用 data.table 包通过另一个排序列创建日期列的时间滞后?
【发布时间】:2014-09-26 01:13:53
【问题描述】:

我目前有一个如下所示的数据集:

data.table(Person=rep(LETTERS[1:3],c(3,4,3)),Time=c(3,5,10,1,3,6,15,2,5,9))

Person    Time
A            3
A            5    
A            10
B            1
B            3
B            6
B            15
C            2
C            5
C            9

每个人都有相应的时间。有没有办法可以创建如下数据集:

Person    Time    Previous
A            3           5            
A            5           10    
A            10          10
B            1           3
B            3           6
B            6           15
B            15          15
C            2           5
C            5           9
C            9           5
D            5           5

在这里,数据集包含一个 Previous 列,它本质上是时间的滞后,但它是由列 Person 完成的。因此,某人在 Person 中的最后一个条目将是该人重复。

我想知道 data.table 包中是否有这个实现。我显然可以使用 apply 函数,但这会很慢。任何建议将不胜感激!谢谢!

【问题讨论】:

  • DT[, lag:=c(tail(Time,-1),tail(Time,1)) ,by=Person] 会使用 data.table 调用中的基本函数将您带到那里。不过可能不会特别利用 data.table 的速度。
  • 这里有一个非data.table的解决方案:within(dat, Previous <- unlist(tapply(Time, Person, function(x) c(x[-1], x[length(x)]))))

标签: r data.table


【解决方案1】:
R> DT[, Previous := c(Time[-1], Time[.N]), by=Person]
R> DT
    Person Time Previous
 1:      A    3        5
 2:      A    5       10
 3:      A   10       10
 4:      B    1        3
 5:      B    3        6
 6:      B    6       15
 7:      B   15       15
 8:      C    2        5
 9:      C    5        9
10:      C    9        9

请注意,.Ndata.table 包中的保留字,是组中的行数,由 by= 参数分段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2015-03-19
    相关资源
    最近更新 更多