создать последовательность повторяющимися соединениями - PullRequest
1 голос
/ 02 июля 2019

Предположим, у меня есть следующие данные:

library(data.table)
set.seed(42)
t <- data.table(time=1001:2000, period=round(runif(1000,1,5)), a=round(rnorm(1000)))
p <- data.table(id=1:10, time=sample(1000:1100,5), a=round(rnorm(10)))


 > t[27:38]
    time period  a
 1: 1027      3 -1
 2: 1028      5 -1
 3: 1029      3  0
 4: 1030      4 -2
 5: 1031      4 -2
 6: 1032      4 -1
 7: 1033      3  0
 8: 1034      4  1
 9: 1035      1  0
10: 1036      4  0
11: 1037      1  0
12: 1038      2 -1

> head(p)
   id time  a
1:  1 1027  1
2:  2 1094  1
3:  3 1044 -1
4:  4 1053  1
5:  5 1015  1
6:  6 1027 -1

, которые аналогичны данным, которые я публиковал ранее как объединенные периоды для получения временных последовательностей, одновременно для разных начальных точек , но теперь имеетдополнительная переменная a, которая переносится из t.

В отличие от моего предыдущего вопроса, моя цель состоит в том, чтобы создать последовательности прямо в p путем объединения n периодов в t.Для n=4 результат в идеале должен выглядеть следующим образом:

> head(p)
   id time  a
1:  1 1027  1
2:  1 1030 -1 
3:  1 1034 -2
4:  1 1038  1
5:  1 1040 -1
6:  2 1094  1

, поскольку для идентификатора 1, начиная с 1027, последовательность будет 1027, 1027+3=1030, 1030+4=1034, 1034+4=1038 и 1038+2=1040, где приращения взяты с t.Кроме того, t$a "берется с собой", чтобы заполнить для p$a.

В моем предыдущем вопросе Jaap дал фантастическое решение для получения двумерного вывода с одной строкой на id.Интересно, можно ли это сделать прямо в p.Возможно, это можно сделать с помощью многократного объединения t в p или, возможно, есть более эффективное решение (потому что здесь ключевой является эффективность).

1 Ответ

0 голосов
/ 03 июля 2019

Я не на 100% уверен в том, что вы хотите сделать с a, чтобы "взять его с собой", но, возможно, эта рекурсия делает то, что вы хотите, хотя я не знаю, достаточно ли она эффективна:

create_sequences <- function(p, n, acc = p) {
  if (n == 0L) return(setkey(acc, id, time))

  next_p <- t[p, .(id, time = time + period, a = x.a), on = "time"]

  create_sequences(next_p, n - 1L, rbindlist(list(acc, next_p)))
}

ans <- create_sequences(p, 4L)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...