【问题标题】:roll join of two non-overlapping `data.table`s两个不重叠的`data.table`的滚动连接
【发布时间】:2014-10-08 18:48:09
【问题描述】:

让我们有两个不重叠的 data.table 并进行滚动连接:

library(data.table)
P = data.table(id=c("a","a"), t=c(1,4), txn=c(0, 0),key=c("id", "t"))
TX = data.table(id=c("a"), t=c(3), txn=c(1111),key=c("id", "t")) # note the index t = 3 falling in the gap of P
P[TX, txn:=i.txn, roll=TRUE]
P
#    id t  txn
# 1:  a 1 1111
# 2:  a 4    0

为什么txn 会滚动到上一个 可用索引(t=1),而roll>0 我希望它会滚动到下一个 可用索引一个(t=4)?

P # expected
#    id t  txn
# 1:  a 1    0
# 2:  a 4 1111

【问题讨论】:

  • 你想得到什么行为?或者你对此没意见,只是问为什么会这样?
  • @smci,他在帖子底部显示了预期的输出。
  • @Arun:我已经阅读了他写的内容。他没有说他是真的想要还是只是出于好奇。他没有说他想要什么。

标签: r data.table


【解决方案1】:

来自?data.table(在roll 参数下):

如果roll=TRUEi 的行匹配除了最后一个x 连接列之外的所有行,并且它在最后一个i 连接列中的值落在一个间隙中(包括在@987654327 中的最后一个观察之后@ 表示该组),然后 x 中的主要值向前滚动。

这里,来自TX (= i) 的值 t=3 位于P 的 t=1 和 t=4 之间。因此,与P (= x) 中的 普遍值 的匹配是 t=1,对应的行是第一行。您可以通过以下方式找到它:

P[TX, which=TRUE, roll=Inf] ## same as roll=TRUE, LOCF
# [1] 1

如果我们这样做:

P[TX, which=TRUE, roll=-Inf] ## NOCB
# [1] 2

这能回答你的问题吗?

【讨论】:

  • 谢谢,确实,返回我需要的结果:P[TX, txn:=i.txn, roll=-Inf]我尝试了很多组合,但是roll=-Inf感觉有点反直觉;假设它是TX 向上或向下滚动P 索引网格以找到最近的非间隙位置, 登录roll 将暗示移动向下网格;情况正好相反
  • 如果你不仔细阅读roll in ?data.table 中给出的解释,这可能是违反直觉的;-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2016-04-18
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2022-01-07
  • 2018-06-24
相关资源
最近更新 更多