[datatable-help] rbindlist and unique

Arunkumar Srinivasan aragorn168b at gmail.com
Wed May 21 13:00:56 CEST 2014


Nathaniel, Thanks.

First, I use rbindlist pretty often, and I've been quite happy with it.  The new  use.names and fill features definitely scratch an itch for me; I wound up using rbind_all from dplyr (which worked well, I'm not complaining), but I'm looking forward to having a data.table implementation.  
A data.table implementation (in rbind) exists since the last release (v1.9.0/2). This one just builds on it.


Arun

From: Nathaniel Graham npgraham1 at gmail.com
Reply: Nathaniel Graham npgraham1 at gmail.com
Date: May 21, 2014 at 2:20:44 AM
To: data.table source forge datatable-help at lists.r-forge.r-project.org
Subject:  [datatable-help] rbindlist and unique  

First, I use rbindlist pretty often, and I've been quite happy with it.  The new use.names and fill features definitely scratch an itch for me; I wound up using rbind_all from dplyr (which worked well, I'm not complaining), but I'm looking forward to having a data.table implementation.  The speed increase is also welcome.  So thank you for the new features!  I don't personally have a preference with respect to the use.names and fill defaults, so whatever you guys decide will be fine with me.

I do have a question regarding unique, which I use very, very frequently, and often after rbindlist.  I have a fairly large data set (tens of millions of raw observations), many of which are duplicates.  The observations come from a variety of sources, but the formats and variable names are (nearly) identical.

The problem is that many "duplicates" aren't perfect duplicates, and some rows have more information than others.  A simple example might look like this:

> foo
   V1 V2   V3
1:  1  3 TRUE
2:  1  4 TRUE
3:  2  3   NA
4:  2  4 TRUE
5:  1  3 TRUE
6:  1  4   NA
7:  2  3 TRUE
8:  2  4 TRUE
9:  3  1   NA
> unique(foo, by = c("V1", "V2"))
   V1 V2   V3
1:  1  3 TRUE
2:  1  4 TRUE
3:  2  3   NA
4:  2  4 TRUE
5:  3  1   NA


Sometimes V3 is present and sometimes it isn't.  V1 and V2 (in my story) uniquely identify an observation, but if there's a row where I also have V3, I'd prefer to have that row rather than a row where it's missing.  You can see that a naive use of unique here gets me the less-preferable 2,3 row.  If I only had three columns, this would be easy to solve (sort/setkey first would do it).  However, I have more than a dozen additional columns, and when I drop duplicates I want to retain the row with the greatest number of non-missing values.  Additionally, some columns are more important than others.  If (to refer again to the example above), there are no rows that have V3 for a given V1 & V2 (like 3,1), I still need to retain a row, so I can't just condition on !is.na(V3).

Does anybody have any insight or techniques for this sort of thing?  I'm currently sorting on all columns prior to unique, but I'm quite sure that this loses some information.


-------
Nathaniel Graham
npgraham1 at gmail.com
npgraham1 at uky.edu
https://sites.google.com/site/npgraham1/
_______________________________________________  
datatable-help mailing list  
datatable-help at lists.r-forge.r-project.org  
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20140521/b06e5b53/attachment.html>


More information about the datatable-help mailing list