<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body>
<p> </p>
<p>Well spotted. Looking at the C source just now it looks like I never considered factor columns in rbindlist().  At the time I needed rbindlist, I needed it quickly for something I was doing, which didn't use factor columns.</p>
<p>Please file as a bug report.  <span>Should be fairly easy to implement, and quick in C.  It would populate the column as if it were character (without actually converting to a new character vector for each item l column) and then call factor() at R level afterwards to refactor it.</span></p>
<p>Matthew</p>
<p> </p>
<p>On 28.03.2013 17:34, Ricardo Saporta wrote:</p>
<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%"><!-- html ignored --><!-- head ignored --><!-- meta ignored -->
<div>
<div style="background-color: #ffffff;">
<div>My apologies, I had a mistake in my previous email.  (I forgot that data.table does not coerce strings to factor)</div>
<div>It looks like the `rbindlist` behavior observed occurs for <em><strong>both</strong></em>, a list of data.tables and a list of data.frames (assuming, of course, that there is factor column present)</div>
<div>    # sample data, using data.frame</div>
<div>    set.seed(1)</div>
<div>    sampleList.DF
<div>      data.frame(Val1=rnorm(3), Val2=runif(3), FactorCol=factor(L)) )</div>
<div>    sampleList.DF
<div>      {x$StringCol
<div>    # sample data, using data.table</div>
<div>    set.seed(1)</div>
<div>    sampleList.DT
<div>      data.table(Val1=rnorm(3), Val2=runif(3), FactorCol=factor(L)) )</div>
<div>    sampleList.DT
<div>       x[, StringCol := as.character(FactorCol)])</div>
<div># rbindlist results: </div>
<div>    rbindlist(sampleList.DT)</div>
<div>    rbindlist(sampleList.DF)</div>
<div># expected behavior similiar to do.call(rbind, LIST)</div>
<div>    do.call(rbind, sampleList.DF)</div>
<div>    do.call(rbind, sampleList.DT)</div>
</div>
</div>
<br /><br />
<div class="gmail_quote">On Thu, Mar 28, 2013 at 12:52 PM, Ricardo Saporta <span><<a href="mailto:saporta@scarletmail.rutgers.edu">saporta@scarletmail.rutgers.edu</a>></span> wrote:<br />
<blockquote class="gmail_quote" style="margin: 0  0  0  .8ex; border-left: 1px  #ccc  solid; padding-left: 1ex;">
<div>Hello, </div>
<div>I found that when using `rbindlist` on a list of data.frames with factor columns, the factor column is getting concat'd as its numeric equivalent. </div>
<div>This of course, does not happen when using a list of data.tables.  </div>
<div>    # sample data, using data.frame</div>
<div>    sampleList.DF
<div>      data.frame(Val1=rnorm(3), Val2=runif(3), FactorCol=L) )</div>
<div>    sampleList.DF
<div>      {x$StringCol
<div>    # sample data, using data.table</div>
<div>    sampleList.DT
<div>      data.table(Val1=rnorm(3), Val2=runif(3), FactorCol=L) )</div>
<div>    sampleList.DT
<div>       x[, StringCol := as.character(FactorCol)])</div>
<div># Compare the column `FactorCol`: </div>
<div>    rbindlist(sampleList.DT)</div>
<div>    rbindlist(sampleList.DF)</div>
<div>    do.call(rbind, sampleList.DF)</div>
<div>Interestingly, I originally thought it was levels dependent: </div>
<div>(I would have expected, for example, the following to allow for the levels of the third list element, but it does not).</div>
<div>    sampleList.DF[[1]][, "FactorCol"]
<div>    </div>
<div>    # all the levels in third element are present in the first</div>
<div>    all(levels(sampleList.DF[[3]][, "FactorCol"])  %in%  levels(sampleList.DF[[1]][, "FactorCol"]))</div>
<div>    # [1] TRUE</div>
<div>But... </div>
<div>    rbindlist(sampleList.DF)</div>
<div>However: </div>
<div>    sampleList.DF[[1]][, "FactorCol"]
<div>    rbindlist(sampleList.DF)</div>
<div>    </div>
<div>Is the above behavior intended? </div>
<div>Cheers, </div>
<div>Rick</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<p> </p>
<div> </div>
</body></html>