использование data.table для создания последовательности из начальных точек и приращений - PullRequest
0 голосов
/ 14 декабря 2018

Я хотел бы использовать data.table для многократного добавления приращения к начальной точке.

library(data.table)
dat <- data.table(time=seq(from=as.POSIXct("2018-01-01 01:00:01"),to=as.POSIXct("2018-01-01 01:00:10"), by="secs"), int=c(2,3,3,1,10,10,10,10,10,10), x=2*1:10)

> dat
                  time inc  x
 1: 2018-01-01 01:00:01   2  2
 2: 2018-01-01 01:00:02   3  4
 3: 2018-01-01 01:00:03   3  6
 4: 2018-01-01 01:00:04   1  8
 5: 2018-01-01 01:00:05  10 10
 6: 2018-01-01 01:00:06  10 12
 7: 2018-01-01 01:00:07  10 14
 8: 2018-01-01 01:00:08  10 16
 9: 2018-01-01 01:00:09  10 18
10: 2018-01-01 01:00:10  10 20

То есть, начиная со строки 1, я хотел бы добавить значение inc к time, получая новое время.Затем мне нужно добавить значение inc в это новое время, чтобы прийти в третий раз.Тогда результат будет

> res
                  time inc  x
1: 2018-01-01 01:00:00   2  2
2: 2018-01-01 01:00:02   3  6
3: 2018-01-01 01:00:05  10 12

. Я бы, наверное, знал, как сделать это в цикле, но мне интересно, может ли data.table справиться с такими проблемами.

Поскольку значения в time являются непрерывными, мои идеи заключались в том, чтобы использовать кумулятивные значения inc для индексации по линиям

index <- dat[...,cumsum(...inc...),...]
dat[index]

, но я не могу получить cumsum() игнорировать значения между точками интереса.Возможно, это можно сделать в i части data.table, но я не знаю как.У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 14 декабря 2018
# start with finding the next time
dat[, next.time := time + int][!dat, on = .(next.time = time), next.time := NA]

# do this in a loop for the actual problem, and stop when final column is all NA
dat[dat, on = .(next.time = time), t1 := i.next.time]
dat[dat, on = .(t1 = time), t2 := i.next.time]

dat
#                   time int  x           next.time                  t1   t2
# 1: 2018-01-01 01:00:01   2  2 2018-01-01 01:00:03 2018-01-01 01:00:06 <NA>
# 2: 2018-01-01 01:00:02   3  4 2018-01-01 01:00:05                <NA> <NA>
# 3: 2018-01-01 01:00:03   3  6 2018-01-01 01:00:06                <NA> <NA>
# 4: 2018-01-01 01:00:04   1  8 2018-01-01 01:00:05                <NA> <NA>
# 5: 2018-01-01 01:00:05  10 10                <NA>                <NA> <NA>
# 6: 2018-01-01 01:00:06  10 12                <NA>                <NA> <NA>
# 7: 2018-01-01 01:00:07  10 14                <NA>                <NA> <NA>
# 8: 2018-01-01 01:00:08  10 16                <NA>                <NA> <NA>
# 9: 2018-01-01 01:00:09  10 18                <NA>                <NA> <NA>
#10: 2018-01-01 01:00:10  10 20                <NA>                <NA> <NA>
...