我有一些这样的数据:
sample.data <- rbind(data.table(start.date=seq(from=as.Date("2010-01-01"), to=as.Date("2014-12-01"), by="quarter"),
Group=c("A","B","C","D"), rnorm(20, 5)),
data.table(start.date=seq(from=as.Date("2010-01-01"), to=as.Date("2014-12-01"), by="quarter"),
Group=c("A","B","C","D"), rnorm(20, 3))
)
Run Code Online (Sandbox Code Playgroud)
我想创建一个end.date等于start.date每个组的下一个最早值的列.
因此,例如,第一个start.date为Group==A是2010-01-01.下一个最早start.date的Group==A是2011-01-01.所以当按以下顺序排序时,最终结果应如下所示Group:
start.date Group end.date
2010-01-01 A 2011-01-01
2010-01-01 A 2011-01-01
2011-01-01 A 2012-01-01
2011-01-01 A 2012-01-01
2012-01-01 A 2013-01-01
2012-01-01 A 2013-01-01
2013-01-01 A 2014-01-01
2013-01-01 A 2014-01-01
2014-01-01 A NA
2014-01-01 A NA
2010-04-01 B 2011-04-01
2010-04-01 B 2011-04-01
2011-04-01 B 2012-04-01
2011-04-01 B 2012-04-01
Run Code Online (Sandbox Code Playgroud)
等等.理想情况下,我想通过引用来做到这一点,比如
sample.data[, end.date := EXPRESSION]
但我不知道从哪里开始.谢谢你的帮助.
可以,然后呢:
events = unique(sample.data[ , .(Group, start.date) ])
events[, next.date := shift(start.date, type="lead"), by=Group]
sample.data[events, on=c("Group", "start.date"), end.date := next.date ]
Run Code Online (Sandbox Code Playgroud)
在我看来,OP应该有一个类似的表events,与数据库设计/ 整洁的数据保持一致.结果看起来像
> sample.data[ order(Group, start.date) ]
start.date Group end.date
1: 2010-01-01 A 2011-01-01
2: 2010-01-01 A 2011-01-01
3: 2011-01-01 A 2012-01-01
4: 2011-01-01 A 2012-01-01
5: 2012-01-01 A 2013-01-01
6: 2012-01-01 A 2013-01-01
7: 2013-01-01 A 2014-01-01
8: 2013-01-01 A 2014-01-01
9: 2014-01-01 A <NA>
10: 2014-01-01 A <NA>
11: 2010-04-01 B 2011-04-01
12: 2010-04-01 B 2011-04-01
...
Run Code Online (Sandbox Code Playgroud)