【发布时间】: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