<div dir="ltr">Sure, here's a recap. The most succinct way of putting it is - the meaning of d[i, j, by = b] is very complicated and unintuitive right now because of hidden by's in some cases and that statement can be made much more readable by making by-without-by's explicit. The longer version follows.<div>
<br></div><div>First let's go over what is done currently, in particular what exactly is by-without-by. The following example, adapted from Matthew's examples illustrates current behavior:<div>
<br></div><div><div>> X = data.table(a = c(1,1,2,2,3,3), b = c(1:6), key = "a")</div><div>> Y = data.table(a = c(1,2,1), key = "a")</div><div>> X[Y]</div><div>   a b</div><div>1: 1 1</div><div>

2: 1 2</div><div>3: 1 1</div><div>4: 1 2</div><div>5: 2 3</div><div>6: 2 4</div><div>> X[Y, sum(b)]</div><div>   a V1</div><div>1: 1  3</div><div>2: 1  3</div><div>3: 2  7</div></div><div><br></div><div>What's happening here is that the action j=sum(b) is performed for each row of Y (or rather each 'a') as if that was a 'by' by the rows of Y. Had Y had unique 'a' values only, this would've been equivalent to doing a 'by' by 'a' after the merge, but there is a difference when Y$a has duplicates.</div>

<div><br></div><div>
This is interesting behavior that can be used in a variety of situations (it also has an interesting leveraging point - if Y$a *is* unique and you'd like to do 'by=a' after the merge, it's more computationally advantageous to do the 'by' *during* the merge and not after), however it interferes with the naturally established action for d[i, j], where for other i's this would simply do action 'j', without doing an extra hidden 'by'.</div>

<div><br></div><div>The proposal is thus to do the above special 'by' only when explicitly asked to - e.g. by adding a new boolean 'each.i = TRUE', the default value for which would be FALSE. This will make syntax much more readable and user-friendly, would eliminate a few FAQ points and would also allow a new kind of action, that afaik is actually not possible with current syntax.</div>


<div><br></div><div>Here's some correspondences - left is new syntax and right is old syntax:</div><div><br></div><div style>Take 'dt' and apply 'i' (where 'i' is anything, including a join):</div>
<div style>  dt[i] <-> dt[i]</div><div style><br></div><div style>Take 'dt' and apply 'i' and return 'j' (for any 'i' and 'j') by 'b':</div><div style>  dt[i, j, by = b] <-> dt[i][, j, by = b] in general, but also dt[i, j, by = b] if 'i' is not a join, and can also be dt[i, j, by = b] if 'i' is a join in some cases but not others</div>
<div style><br></div><div style>Take 'dt' and apply 'i' and return j, applying cross-apply/by-without-by (will do cross-apply only when 'i' is a join):</div><div style>  dt[i, j, each.i = TRUE] <-> dt[i, j]</div>
<div style><br></div><div style>Take 'dt' and apply 'i', return j over *both* the cross-apply/by-without-by (for 'i' being a join only) and another specified 'by', think of this as doing by=list(b, rows of Y):</div>
<div style>  dt[i, j, by = b, each.i = TRUE] <-> afaik there is no direct correspondence in current behavior</div><div style><br></div><div><div><br></div><div><br>On Tuesday, April 30, 2013, Ricardo Saporta  wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr">Eddi, <div><br></div><div>
Perhaps you could summarize succinctly, now after a good bit of discussion,  what your proposed change is. </div><div class="gmail_extra"><br></div><div class="gmail_extra">-Rick<br>

<br><br><div class="gmail_quote">On Tue, Apr 30, 2013 at 7:10 PM, statquant3 <span dir="ltr"><<a>statquant@outlook.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Hi, I red the 30 posts and I have to confess that I still do not understand<br>
the point of the changes...<br>
Could anyone kindly write an example of the current behaviour and what the<br>
new option will bring to the table ?<br>
Sorry...<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://r.789695.n4.nabble.com/changing-data-table-by-without-by-syntax-to-require-a-by-tp4664770p4665873.html" target="_blank">http://r.789695.n4.nabble.com/changing-data-table-by-without-by-syntax-to-require-a-by-tp4664770p4665873.html</a><br>




<div>Sent from the datatable-help mailing list archive at Nabble.com.<br>
</div><div><div>_______________________________________________<br>
datatable-help mailing list<br>
<a>datatable-help@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help</a><br>
</div></div></blockquote></div><br></div></div>
</blockquote></div></div>
</div></div>