У меня есть следующие данные в качестве примера:
library(data.table)
set.seed(42)
t <- data.table(time=1:1000, period=round(runif(100,1,5)))
p <- data.table(id=1:10, cut=sample(1:100,5))
> t[62:71]
time period
1: 62 5
2: 63 4
3: 64 3
4: 65 4
5: 66 2
6: 67 2
7: 68 4
8: 69 4
9: 70 2
10: 71 1
> head(p)
id cut
1: 1 63
2: 2 22
3: 3 99
4: 4 38
5: 5 91
6: 6 63
, где t
дает некоторый вектор periods
, связанный с временными точками, а p
дает каждому человеку отсечение в time
.
Для каждого человека в p
я хотел бы начать с отсечения этого человека и создать последовательность из 4 временных точек, объединяя periods
.Например, для лица 1, начиная с момента 63, последовательность будет иметь вид 63
, 63+4=67
, 67+2=69
и 69+4=73
.
В идеале, результат будет:
> head(res)
id t1 t2 t3 t4
1 63 67 69 73
2 22 24 29 32
3 99 103 105 109
4 38 40 43 44
5 91 95 100 103
6 63 67 69 73
Ранее я узнал, как создавать последовательности, используя accumulate::purrr
( итеративная сумма, где сумма определяет следующую позицию, которая будет добавлена ).Однако мне интересно, можно ли сделать что-то подобное одновременно для разных людей, использующих data.table
или другие пакеты, но избегая циклов for, поскольку наборы данных довольно велики.
edit: версия, гдезначения времени не совпадают с указателями строк
library(data.table)
set.seed(42)
t <- data.table(time=1001:2000, period=round(runif(100,1,5)))
p <- data.table(id=1:10, cut=sample(1:100,5))
аналогично приведенному выше, за исключением
> t[62:71]
time period
1: 1062 5
2: 1063 4
3: 1064 3
4: 1065 4
5: 1066 2
6: 1067 2
7: 1068 4
8: 1069 4
9: 1070 2
10: 1071 1
, где t$time[i]
не равно i
, что запрещает Jaap'sПервое решение.