2014-10-08 44 views
2

让我们两个不重叠data.tables并做滚动加盟:卷加盟的两个非重叠`data.table`s

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 
+0

你想要得到什么行为?或者你对此感到满意,只是问为什么会发生? – smci 2014-10-08 19:26:55

+1

@smci,他在帖子的底部显示了预期的输出。 – Arun 2014-10-08 19:30:54

+0

@阿伦:我已经读过他写的东西了。他没有说他是否真的想**,或者只是因为好奇而问。他没有说他想要什么。 – smci 2014-10-09 01:11:25

回答

3

?data.table(下roll参数):

如果roll=TRUEi的行匹配所有,但最后x联接列,其价值在过去i联接列落在差距(包括在x最后一次观察该组后),那么x中的主要值将前滚。

在此,值t = 3,从TX(= i)选自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 

这是否回答你的问题?

+0

谢谢,它会返回我需要的结果:'P [TX,txn:= i.txn,roll = -Inf]'我尝试了很多组合,但'roll = -Inf'感觉有点反 - 直观;因为它是'TX'向上或向下滚动'P'索引网格以找到最近的非间隙位置,_positive_ sign in'roll'会在移动时向网格提示;恰恰相反的行为就是这种情况 – 2014-10-08 20:16:27

+0

如果你不经过在''data.table' ;-)'roll'下给出的解释,它可能会违反直觉。 – Arun 2014-10-08 20:22:18