<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have posted this on SO as well:<div><br></div><div><div>I am trying to understand a little more about the way rolling joins work and am having some confusion, I was hoping somebody could clarify this for me.  To take a concrete example:</div>

<div><br></div><div>    dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key=list(id, t))</div><div>    dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key=list(id, t))</div><div><br></div><div>I expected this to produce a long `data.table` where the values in `dt2` are rolled:</div>

<div><br></div><div>    dt1[dt2,roll=TRUE]</div><div><br></div><div>Instead, the correct way to do this seems to be:</div><div><br></div><div>    dt2[dt1,roll=TRUE]</div><div><br></div><div>Could someone explain to me more about how joining in `data.table` works as I am clearly not understanding it correctly.  I thought that `dt1[dt2,roll=TRUE]` corresponded to the sql equivalent of `select * from dt1 right join dt2 on (<a href="http://dt1.id" target="_blank">dt1.id</a> = <a href="http://dt2.id" target="_blank">dt2.id</a> and dt1.t = dt2.t)`, except with the added functionality locf.</div>

<div><br></div><div>Additionally the documentation says:</div><div><br></div><div>    X[Y] is a join, looking up X's rows using Y (or Y's key if it has one) </div><div>    as an index.</div><div><br></div><div>This makes it seem that only rows in X should be returned and the join being done is an inner join, not outer.  What about in the case when `roll=T` but that particular `id` does not exist in `dt1`? Playing around a bit more I can't understand what value is being placed into the column when there is only 1 key in dt2.. this might be inappropriate usage.</div>

</div>
</blockquote></div><br>