【问题标题】:create sequence by repeated joins通过重复连接创建序列
【发布时间】:2019-07-02 16:25:25
【问题描述】:

假设我有以下数据:

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

这与我之前以concatenate periods to get time sequences, simultaneously for different starting points 发布的数据相似,但现在有一个附加变量a 是从t 继承而来的。

与我之前的问题相反,我的目标是通过连接 t 中的 n 个句点来将序列直接创建到 p 中。对于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

因为对于 id 1,从 1027 开始,序列是 10271027+3=10301030+4=10341034+4=10381038+2=1040,其中增量取自 t。此外,t$a 被“带走”填写为p$a

在我之前的问题中,Jaap 给出了一个绝妙的解决方案来获得每id 一行一行的二维输出。我想知道这是否可以直接在p 中实现。也许这可以通过重复使用 tp 的连接来完成,或者可能有更有效的解决方案(因为效率是这里的关键)。

【问题讨论】:

  • 已经给出了所需的输出。但是,我已经更改了文本并且(希望)使其更清晰。
  • 期望输出的最后一行不应该是2 1094 1吗?
  • 绝对。谢谢!

标签: r join data.table sequence


【解决方案1】:

我不能 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2015-09-15
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多