@Dennis<div><br></div><div>Thanks for your suggestion, that would indeed work in this particular case in which you are only matching to one numeric column that is statistically well defined (in this case, uniformly distributed). My use case, which is not that uncommon I guess, is more general, and instead of trying to make an example (I failed twice on that now, sorry for that ;-), let&#39;s discuss it more general:</div>

<div><br></div><div>Starting with the idiom x[i, where i is a data.table which columns match to the keys in x. Quoting the help page: <span class="Apple-style-span" style="border-collapse:separate;font-family:Arial;font-size:medium"><span class="Apple-style-span" style="font-family:sans-serif;font-size:13px">When <code>i</code> is a <code>data.table</code>, <code>x</code> must have a key. <code>i</code> is <em>joined</em> to <code>x</code> using the key and the rows in <code>x</code> that match are returned. When it comes to &quot;the rows in x that match are returned&quot;, there are currently three options: </span></span></div>

<div><ul><li><span style="font-family:sans-serif;font-size:13px">mult=&quot;all&quot;. As far as I see it, this is not applicable in its current implementation to a real life MCS, because it just gets too big pretty fast. So any solution that starts with calling mult=&quot;all&quot; first and then do some random drawing fails. However, and this is what Dennis&#39; solution does, is that one could use the fact that in a MCS many runs are identical. In the example above, although intJoin contains 10,000 rows, it&#39;s basically only 10 joins (for every year one). So one could expect the user to do that himself, thus leaving base data.table lean. However, in my opinion this is not easy. As an example (I try it again), let&#39;s assume i consists of four characteristics, so there are 4^4 = 256 combinations. Those combinations aren&#39;t uniformly distributed, so in a MCS of n=10,000 combination 1 (C1) might occur 2,000 times, C2 1,000 times and C256 10 times. Now, the user only has to join 256, but he has to keep track about how often every combination occurs. After that, he has to sample from every combination according to its occurrence (get 2,000 random samples from the join of dt and C1, 1,000 random samples from the join of dt and C2, etc.). And after that he has to join those tables again. In my opinion, that is tough and error-prone.</span></li>

<li><span style="font-family:sans-serif;font-size:13px">mult=&quot;first&quot;: Not applicable to MCS.</span></li><li><span style="font-family:sans-serif;font-size:13px">mult=&quot;last&quot;: </span><span style="font-family:sans-serif;font-size:13px">Not applicable to MCS.</span></li>

</ul><div><font face="sans-serif">So I still think there is a valid point for mult=&quot;random&quot; because I don&#39;t see an easy and flexible workaround with the current options in data.table. With respect to Steve&#39;s comment: I see your point and I think Matthew has some thoughts on that. However, I can&#39;t think of any good examples for weighting sampling because i already does that implicitly. That is, in a MCS, i should put more weight on combinations that agree more frequently, so you don&#39;t really need a weighted sampling (in the example above this is done by the fact that C1 is 2,000 times in i, C256 only 10 times). The idea of weighting would be useful if you went with the approach outlined in mult=&quot;all&quot;, i.e. you get rid of all duplicates and do every join only once. Then it would be great to have an option to tell R/data.table how often every option would occur. In the example above, you then would have a weighting vector for the different combinations C1, C2, ..., C256 of c(0.2, 0.1,..., 0.001).</font></div>

<div><font face="sans-serif"><br></font></div><div><font face="sans-serif">However, data.table is out for a while now and apparently, this issue hasn&#39;t come up before, so I guess we should just keep it in mind and move on. I could raise a feature request with lowest priority that links to this thread .</font></div>

<div><font face="sans-serif"><br></font></div><div><font face="sans-serif">Christoph</font></div><br><div class="gmail_quote">On Sun, Jan 8, 2012 at 12:00 PM,  <span dir="ltr">&lt;<a href="mailto:datatable-help-request@r-forge.wu-wien.ac.at">datatable-help-request@r-forge.wu-wien.ac.at</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send datatable-help mailing list submissions to<br>
        <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<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>
<br>
or, via email, send a message with subject or body &#39;help&#39; to<br>
        <a href="mailto:datatable-help-request@lists.r-forge.r-project.org">datatable-help-request@lists.r-forge.r-project.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:datatable-help-owner@lists.r-forge.r-project.org">datatable-help-owner@lists.r-forge.r-project.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of datatable-help digest...&quot;<br>
<br>
<br>
Today&#39;s Topics:<br>
<br>
   1. Re: What&#39;s your opinion on the feature request: add option<br>
      mult=&quot;random&quot; (djmuseR)<br>
   2. Re: What&#39;s your opinion on the feature request:   add option<br>
      mult=&quot;random&quot; (Steven C. Bagley)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Sat, 7 Jan 2012 06:32:22 -0800 (PST)<br>
From: djmuseR &lt;<a href="mailto:djmuser@gmail.com">djmuser@gmail.com</a>&gt;<br>
Subject: Re: [datatable-help] What&#39;s your opinion on the feature<br>
        request: add option mult=&quot;random&quot;<br>
To: <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
Message-ID: &lt;<a href="mailto:1325946742615-4273090.post@n4.nabble.com">1325946742615-4273090.post@n4.nabble.com</a>&gt;<br>
Content-Type: text/plain; charset=us-ascii<br>
<br>
Hi:<br>
<br>
Here&#39;s one possible alternative:<br>
<br>
# I just made intJoin an integer vector rather than a one column data table<br>
intJoin &lt;- sample(seq_len(10), size = 10000, replace = TRUE)<br>
&gt; table(intJoin)<br>
intJoin<br>
   <a href="tel:1%20%20%20%202%20%20%20%203%20%20%20%204%20%20%20%205%20%20%20%206%20%20%20%207%20%20%20%208%20%20%20%209%20%20%2010" value="+12345678910">1    2    3    4    5    6    7    8    9   10</a><br>
 951 1001  969 1063  999 1007 1004 1035  933 1038<br>
<br>
# This function takes samples of size n_i from each year&#39;s sub-data<br>
# with replacement, since the sample size can be higher than the<br>
# number of rows in each sub-data table (1000 in this case)<br>
h &lt;- function(dt, svec) {<br>
     ns &lt;- as.vector(table(svec))<br>
     dt[, .SD[sample(nrow(.SD), ns[Year], replace = TRUE), ], by = &#39;Year&#39;]<br>
    }<br>
u &lt;- h(rawData, intJoin)<br>
&gt; dim(u)<br>
[1] 10000     2<br>
&gt; head(u)<br>
     Year fundID<br>
[1,]    1  20091<br>
[2,]    1  92311<br>
[3,]    1  18341<br>
[4,]    1  79721<br>
[5,]    1  13391<br>
[6,]    1  15301<br>
<br>
# Check:<br>
&gt; table(u$Year)<br>
   <a href="tel:1%20%20%20%202%20%20%20%203%20%20%20%204%20%20%20%205%20%20%20%206%20%20%20%207%20%20%20%208%20%20%20%209%20%20%2010" value="+12345678910">1    2    3    4    5    6    7    8    9   10</a><br>
 951 1001  969 1063  999 1007 1004 1035  933 1038<br>
&gt; system.time(h(rawData, intJoin))<br>
   user  system elapsed<br>
   0.03    0.00    0.03<br>
<br>
Since timings differ on machines, I tried out your foo1() function for<br>
comparison, after converting intJoin to a data table:<br>
&gt; intJoin &lt;- J(sample(seq_len(10), size = 10000, replace = TRUE))<br>
&gt; system.time(finalData &lt;- foo1(10000, intJoin, rawData))<br>
   user  system elapsed<br>
  30.61    0.03   30.7<br>
<br>
HTH,<br>
Dennis<br>
<br>
--<br>
View this message in context: <a href="http://r.789695.n4.nabble.com/What-s-your-opinion-on-the-feature-request-add-option-mult-random-tp4267483p4273090.html" target="_blank">http://r.789695.n4.nabble.com/What-s-your-opinion-on-the-feature-request-add-option-mult-random-tp4267483p4273090.html</a><br>


Sent from the datatable-help mailing list archive at Nabble.com.<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Sat, 7 Jan 2012 19:07:53 -0800<br>
From: &quot;Steven C. Bagley&quot; &lt;<a href="mailto:steven.bagley@gmail.com">steven.bagley@gmail.com</a>&gt;<br>
Subject: Re: [datatable-help] What&#39;s your opinion on the feature<br>
        request:        add option mult=&quot;random&quot;<br>
To: <a href="mailto:christoph.jaeckel@wi.tum.de">christoph.jaeckel@wi.tum.de</a><br>
Cc: <a href="mailto:datatable-help@r-forge.wu-wien.ac.at">datatable-help@r-forge.wu-wien.ac.at</a><br>
Message-ID: &lt;<a href="mailto:3648349B-5BD2-4911-AB5B-9ECC653C5D83@gmail.com">3648349B-5BD2-4911-AB5B-9ECC653C5D83@gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
The mult argument is becoming its own little programming language. I worry that this is going to get complicated in an ad hoc way. What if someone wants random, but with weighting? Each new value of mult is really shorthand for an R language construct. Maybe there is a more general way to express these ideas using existing R constructs? (I&#39;m not sure how to do this consistently. I&#39;m merely making an observation.)<br>


<br>
--Steve<br>
<br>
On Jan 6, 2012, at 5:58 AM, Christoph J?ckel wrote:<br>
<br>
&gt; Thanks for your feedback. @Chris: I guess Matthew&#39;s example and your&#39;s do not really match because he doesn&#39;t call sample(dt,...), but sample(dt[i, which=TRUE],... His option, though, returns all the rows that match between the keys of dt and i and takes a random sample of size 1 from that, so I guess it does what I expected. Nevertheless, I think an option mult=&quot;random&quot; would still be useful. Here is why:<br>


&gt;<br>
&gt; I guess my first example was a little bit too simplistic, sorry for that! Here is an updated, more realistic example of what I do and some hints about my current implementation of mult=&quot;random&quot;:<br>
&gt;<br>
&gt; require(data.table)<br>
&gt; rawData &lt;- data.table(fundID = 1:1e5,<br>
&gt;                       Year   = rep(1:10, times=1e4),<br>
&gt;                       key    = &quot;Year&quot;)<br>
&gt; #Let&#39;s have 10000 runs; in each run we want to draw a fund with a year that is<br>
&gt; #set dynamically<br>
&gt; intJoin &lt;- J(sample(1:10, size=10000, replace=TRUE))<br>
&gt;<br>
&gt; #Best solution I have come up so far with the current options in data.table<br>
&gt; #Is there one that can beat mult=&quot;random&quot; and is easy for the user to implement?<br>
&gt; foo1 &lt;- function(n, intJoin, rawData) {<br>
&gt;     x &lt;- integer(n)<br>
&gt;     for (r in seq_len(nrow(intJoin))) {<br>
&gt;       x[r] &lt;- sample(rawData[intJoin[r], which=TRUE], size=1)<br>
&gt;     }<br>
&gt;     return(rawData[x])<br>
&gt; }<br>
&gt; system.time(finalData &lt;- foo1(10000, intJoin, rawData))<br>
&gt; #    user  system elapsed<br>
&gt; #  43.827   0.000  44.232<br>
&gt; #Check that it does what it should: match random entities to the exact year in intJoin<br>
&gt; cbind(finalData, intJoin)<br>
&gt; #       fundID Year V1<br>
&gt; #  [1,]  46556    6  6<br>
&gt; #  [2,]  77642    2  2<br>
&gt; #  [3,]  17325    5  5<br>
&gt; #  [4,]  36617    7  7<br>
&gt; #  [5,]  90697    7  7<br>
&gt; #  [6,]   4536    6  6<br>
&gt; #  [7,]  22273    3  3<br>
&gt; #  [8,]  46825    5  5<br>
&gt; #  [9,]  65788    8  8<br>
&gt; # [10,]  14153    3  3<br>
&gt;<br>
&gt; #My implementation of mult=&quot;random&quot;<br>
&gt; system.time(finalData &lt;- rawData[intJoin, mult=&quot;random&quot;])<br>
&gt; #   user  system elapsed<br>
&gt; #  0.324   0.016   0.337<br>
&gt; #Pretty fast and easy to understand<br>
&gt; #Check that it does what it should: match random entities to the exact year in intJoin<br>
&gt; cbind(finalData, intJoin)<br>
&gt; #       Year fundID V1<br>
&gt; #  [1,]    6  39626  6<br>
&gt; #  [2,]    2  98552  2<br>
&gt; #  [3,]    5  85425  5<br>
&gt; #  [4,]    7  24637  7<br>
&gt; #  [5,]    7  74797  7<br>
&gt; #  [6,]    6  87626  6<br>
&gt; #  [7,]    3  88973  3<br>
&gt; #  [8,]    5  60335  5<br>
&gt; #  [9,]    8  62298  8<br>
&gt; # [10,]    3  23283  3<br>
&gt;<br>
&gt; If you want to try it out yourself: Just call<br>
&gt;<br>
&gt; fixInNamespace(&quot;[.data.table&quot;, pos=&quot;package:data.table&quot;)<br>
&gt;<br>
&gt; and change the following lines in the editor (this applies to data.table 1.7.7):<br>
&gt;<br>
&gt; OLD LINE:     if (!mult %in% c(&quot;first&quot;, &quot;last&quot;, &quot;all&quot;)) stop(&quot;mult argument can only be &#39;first&#39;,&#39;last&#39; or &#39;all&#39;&quot;)<br>
&gt; NEW LINE:     if (!mult %in% c(&quot;first&quot;,&quot;last&quot;,&quot;all&quot;, &quot;random&quot;)) stop(&quot;mult argument can only be &#39;first&#39;,&#39;last&#39;, &#39;all&#39;, or &#39;random&#39;&quot;)<br>


&gt;<br>
&gt; and<br>
&gt;<br>
&gt; OLD LINES: else {<br>
&gt;                 irows = if (mult == &quot;first&quot;)<br>
&gt;                   idx.start<br>
&gt;                 else idx.end<br>
&gt;                 lengths = rep(1L, length(irows))<br>
&gt;             }<br>
&gt;<br>
&gt; NEW LINES:  } else if (mult==&quot;first&quot;) {<br>
&gt;               irows = idx.start<br>
&gt;               lengths=rep(1L,length(irows))<br>
&gt;             } else if (mult==&quot;last&quot;) {<br>
&gt;               irows = idx.end<br>
&gt;               lengths=rep(1L,length(irows))<br>
&gt;             } else {<br>
&gt;               irows = mapply(function(x1, x2) {sample(x1:x2, size=1)}, idx.start, idx.end)<br>
&gt;               lengths = rep(1L,length(irows))<br>
&gt;             }<br>
&gt;<br>
&gt; However, I don&#39;t know what&#39;s going on in the line<br>
&gt; .Call(&quot;binarysearch&quot;, i, x, as.integer(leftcols -<br>
&gt;                 1), as.integer(rightcols - 1), haskey(i), roll,<br>
&gt;                 rolltolast, idx.start, idx.end, PACKAGE = &quot;data.table&quot;)<br>
&gt;<br>
&gt; I figured out that idx.start and idx.end are changed with this function call and I guess at this point in the function it should always be that idx.start and idx.end are of the same lenght and both return only integer values that represent rows of x, but here I&#39;m not 100% sure. So maybe additional checks are needed in the else clause when the mapply-function is called.<br>


&gt;<br>
&gt; So let me know what you think. I will join the project independent of that particular issue and try to help, but I guess I should start with simple things. So if there is any help needed on documentation checking<br>


&gt; or stuff like that, just let me know and I try my best!<br>
&gt;<br>
&gt; Christoph<br>
&gt;<br>
&gt; On Fri, Jan 6, 2012 at 1:52 PM, Chris Neff &lt;<a href="mailto:caneff@gmail.com">caneff@gmail.com</a>&gt; wrote:<br>
&gt; That isn&#39;t doing quite what he does.  I don&#39;t know what you expected<br>
&gt;<br>
&gt; sample(dt, size=1)<br>
&gt;<br>
&gt; to do but it seems to essentially do this:<br>
&gt;<br>
&gt; dt[sample(1:ncol(dt),size=1),]<br>
&gt;<br>
&gt; It picking a random column number and then return that row instead.<br>
&gt; Try it for yourself:<br>
&gt;<br>
&gt; dt=data.table(x=1:10,y=1:10,z=1:10)<br>
&gt; sample(dt, size=1)<br>
&gt;<br>
&gt; The only rows you will get is 1,1,1 2,2,2 and 3,3,3.  Caveat as usual<br>
&gt; is I&#39;m on 1.7.1 until my crashing bug is fixed so apologies if this<br>
&gt; works properly in later versions.<br>
&gt;<br>
&gt; Note that this diverges from what sample(df, size=1) does, which is<br>
&gt; picks a random column and returns that whole column.<br>
&gt;<br>
&gt; What he really wants is to pick a random row from each subset (I<br>
&gt; think). None of your examples do that and I can&#39;t think of a simpler<br>
&gt; way than what he suggests.<br>
&gt;<br>
&gt; On 6 January 2012 03:34, Matthew Dowle &lt;<a href="mailto:mdowle@mdowle.plus.com">mdowle@mdowle.plus.com</a>&gt; wrote:<br>
&gt; &gt; Very keen for direct contributions in that way, happy to help you with<br>
&gt; &gt; svn etc, and you joining the project.<br>
&gt; &gt;<br>
&gt; &gt; In this particular example, how about :<br>
&gt; &gt;<br>
&gt; &gt;    rawData[sample(rawData[J(&quot;eu&quot;), which=TRUE],size=1)]<br>
&gt; &gt;<br>
&gt; &gt; This solves the inefficiency of the 1st step; i.e.,<br>
&gt; &gt;    intDT &lt;- rawData[J(&quot;eu&quot;), mult=&quot;all&quot;]<br>
&gt; &gt; which copies a subset of all the columns, whilst retaining flexibility<br>
&gt; &gt; for the user so user can easily sample 2 rows, or any other R method to<br>
&gt; &gt; select a random subset.<br>
&gt; &gt;<br>
&gt; &gt; Because of potential scoping conflicts (say a column was called<br>
&gt; &gt; &quot;rawData&quot; i.e. the same name of the table), to be more robust :<br>
&gt; &gt;<br>
&gt; &gt; x = sample(rawData[J(&quot;eu&quot;), which=TRUE],size=1)<br>
&gt; &gt; rawData[x]<br>
&gt; &gt;<br>
&gt; &gt; This is slightly different because when i is a single name (x in this<br>
&gt; &gt; case), data.table knows the caller must mean the x in calling scope, not<br>
&gt; &gt; the column called &quot;x&quot; (if any).  Is two steps like this ok?  I&#39;m<br>
&gt; &gt; guessing it was really the inefficiency that was the motivation?<br>
&gt; &gt;<br>
&gt; &gt; Matthew<br>
&gt; &gt;<br>
&gt; &gt; On Fri, 2012-01-06 at 00:20 +0100, Christoph J?ckel wrote:<br>
&gt; &gt;&gt; Hi together,<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; I run a Monte Carlo simulation on a data.table and do that currently<br>
&gt; &gt;&gt; with a loop: on every run, I choose a subset of rows subject to<br>
&gt; &gt;&gt; certain criteria and from those rows I take a random element.<br>
&gt; &gt;&gt; Currently, I do the following: Let&#39;s say I have funds from two regions<br>
&gt; &gt;&gt; (&quot;eu&quot; and &quot;us&quot;) and I want to choose a random fund from &quot;eu&quot; (could be<br>
&gt; &gt;&gt; &quot;us&quot; in the next run and a different region in the third):<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; library(data.table)<br>
&gt; &gt;&gt; rawData &lt;- data.table(fundID  = letters,<br>
&gt; &gt;&gt;                       compGeo = rep(c(&quot;us&quot;, &quot;eu&quot;), each=13))<br>
&gt; &gt;&gt; setkey(rawData, &quot;compGeo&quot;)<br>
&gt; &gt;&gt; intDT &lt;- rawData[J(&quot;eu&quot;), mult=&quot;all&quot;]<br>
&gt; &gt;&gt; intDT[<a href="http://sample.int" target="_blank">sample.int</a>(nrow(intDT), size=1)]<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; So my idea is to just give the user the option mult=&quot;random&quot;, which<br>
&gt; &gt;&gt; does this in one step. What do you think about that feature request?<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; With respect to the implementation: I changed a few lines in the<br>
&gt; &gt;&gt; function &#39;[.data.table&#39; and got this to run on my locale data.table<br>
&gt; &gt;&gt; version, so I guess I could implement it (as far as I can see, one<br>
&gt; &gt;&gt; just needs to change some R code). However, I haven&#39;t done extensive<br>
&gt; &gt;&gt; testing and I&#39;m not an expert on shared projects and subversion (never<br>
&gt; &gt;&gt; did that actually), so I guess I would need some help to start with<br>
&gt; &gt;&gt; and the confirmation I couldn&#39;t break anything ;-)<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Christoph<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; _______________________________________________<br>
&gt; &gt;&gt; datatable-help mailing list<br>
&gt; &gt;&gt; <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
&gt; &gt;&gt; <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>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; datatable-help mailing list<br>
&gt; &gt; <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
&gt; &gt; <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>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; datatable-help mailing list<br>
&gt; <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
&gt; <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>
<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: &lt;<a href="http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20120107/15013b94/attachment-0001.htm" target="_blank">http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20120107/15013b94/attachment-0001.htm</a>&gt;<br>


<br>
------------------------------<br>
<br>
_______________________________________________<br>
datatable-help mailing list<br>
<a href="mailto:datatable-help@lists.r-forge.r-project.org">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>
<br>
End of datatable-help Digest, Vol 23, Issue 9<br>
*********************************************<br>
</blockquote></div><br><br>
</div>