require(data.table)
set.seed(333)
t <- data.table(old=1002:2001, dif=sample(1:10,1000, replace=TRUE))
t$new <- t$old + t$dif; t$foo <- rnorm(1000); t$dif <- NULL
i <- data.table(id=1:3, start=sample(1000:1990,3))
> i
id start
1: 1 1002
2: 2 1744
3: 3 1656
> head(t)
old new foo
1: 1002 1007 -0.7889534
2: 1003 1004 0.3901869
3: 1004 1014 0.7907947
4: 1005 1011 2.0964612
5: 1006 1007 1.1834171
6: 1007 1015 1.1397910
Я хотел бы удалить временные точки из points
так, чтобы только те строки остались там, где new[i] = old[i-1]
, давая непрерывную последовательность некоторого фиксированного количества временных точек. В идеале это должно быть сделано для всех id
в i
одновременно, где start
дает начальные точки. Например, если мы выберем n=5
, мы должны получить
> head(ans)
id old new foo
1: 1 1002 1007 -0.7889534
2: 1 1007 1015 1.1397910
3: 1 1015 1022 -1.2193670
4: 1 1022 1024 1.2039050
5: 1 1024 1026 0.4388586
6: 2 1744 1750 -0.1368320
, где строки с 3 по 6 не могут быть выведены выше, а foo
обозначает другие переменные, которые необходимо сохранить.
Может ли это быть эффективно сделано в data.table, например, с использованием умной комбинации соединений?
PS. Этот вопрос чем-то похож на мой предыдущий , но я изменил ситуацию, чтобы сделать ее более понятной.