[datatable-help] Force evaluation of first argument to [

Bacou, Melanie mel at mbacou.com
Fri Feb 14 12:52:08 CET 2014


Hi John, Matt,

In this case, why not simply using the standard data.table approach with 
.SD?

fbq.cp[, lapply(.SD, function(x) ifelse(is.na(x), FALSE, x)), 
.SDcols=c("foo", "bar", "qux")]

--Mel.


On 2/12/2014 2:22 PM, Matt Dowle wrote:
>
> Ha.  Yes we certainly don't hold back from making the messages as long 
> and as helpful as possible.  If the code knows, or can know what 
> exactly is wrong, it's a deliberate policy to put that info right 
> there into the message. data.table is written by users; i.e. we wrote 
> it for ourselves doing real jobs. I think that may be the root of 
> that.  If any messages could more helpful,  those suggestions are very 
> welcome.
>
> Matt
>
> On 12/02/14 17:58, John Laing wrote:
>> Thanks, Matt! With a slight amendment that works great:
>> for (x in c("foo", "bar", "qux")) set(fbq, which(is.na 
>> <http://is.na>(fbq[[x]])), x, FALSE)
>>
>> Which highlights an opportunity to say that I really appreciate the 
>> unusually helpful error messages in this package.
>>
>> -John
>>
>>
>> On Wed, Feb 12, 2014 at 12:44 PM, Matt Dowle <mdowle at mdowle.plus.com 
>> <mailto:mdowle at mdowle.plus.com>> wrote:
>>
>>
>>     Hi John,
>>
>>     In examples like this I'd use set() and [[,  since it's a bit
>>     easier to write but memory efficient too.
>>
>>     for (x in c("foo", "bar", "qux"))   set(fbq, is.na
>>     <http://is.na>(fbq[[x]]), x, FALSE)           [untested]
>>
>>     A downside here is one repetition of the "fbq" symbol,  but can
>>     live with that.  If you have a large number of columns  (and I've
>>     been surprised just how many columns some poeple have!) then
>>     calling set() many times has lower overhead than DT[, :=],  see
>>     ?set.   Note also that [[ is base R, doesn't copy the column and
>>     often useful to use with data.table.
>>
>>     Or, use get() in either i or j rather than eval().
>>
>>     HTH, Matt
>>
>>
>>
>>     On 12/02/14 17:24, John Laing wrote:
>>>     Let's say I merge together several data.tables such that I wind up
>>>     with lots of NAs:
>>>
>>>     require(data.table)
>>>     foo <- data.table(k=1:4, foo=TRUE, key="k")
>>>     bar <- data.table(k=3:6, bar=TRUE, key="k")
>>>     qux <- data.table(k=5:8, qux=TRUE, key="k")
>>>     fbq <- merge(merge(foo, bar, all=TRUE), qux, all=TRUE)
>>>     print(fbq)
>>>     #    k  foo  bar  qux
>>>     # 1: 1 TRUE   NA   NA
>>>     # 2: 2 TRUE   NA   NA
>>>     # 3: 3 TRUE TRUE   NA
>>>     # 4: 4 TRUE TRUE   NA
>>>     # 5: 5   NA TRUE TRUE
>>>     # 6: 6   NA TRUE TRUE
>>>     # 7: 7   NA   NA TRUE
>>>     # 8: 8   NA   NA TRUE
>>>
>>>     I want to go through those columns and turn each NA into FALSE.
>>>     I can
>>>     do this by writing code for each column:
>>>
>>>     fbq.cp <- copy(fbq)
>>>     fbq.cp[is.na <http://is.na>(foo), foo:=FALSE]
>>>     fbq.cp[is.na <http://is.na>(bar), bar:=FALSE]
>>>     fbq.cp[is.na <http://is.na>(qux), qux:=FALSE]
>>>     print(fbq.cp)
>>>     #    k   foo   bar   qux
>>>     # 1: 1  TRUE FALSE FALSE
>>>     # 2: 2  TRUE FALSE FALSE
>>>     # 3: 3  TRUE  TRUE FALSE
>>>     # 4: 4  TRUE  TRUE FALSE
>>>     # 5: 5 FALSE  TRUE  TRUE
>>>     # 6: 6 FALSE  TRUE  TRUE
>>>     # 7: 7 FALSE FALSE  TRUE
>>>     # 8: 8 FALSE FALSE  TRUE
>>>
>>>     But I can't figure out how to do it in a loop. More precisely, I
>>>     can't
>>>     figure out how to make the [ operator evaluate its first argument in
>>>     the context of the data.table. All of these have no effect:
>>>     for (x in c("foo", "bar", "qux")) fbq[is.na <http://is.na>(x),
>>>     eval(x):=FALSE]
>>>     for (x in c("foo", "bar", "qux")) fbq[is.na
>>>     <http://is.na>(eval(x)), eval(x):=FALSE]
>>>     for (x in c("foo", "bar", "qux")) fbq[eval(is.na
>>>     <http://is.na>(x)), eval(x):=FALSE]
>>>
>>>     I'm running R 3.0.2 on Linux, data.table 1.8.10.
>>>
>>>     Thanks in advance,
>>>     John
>>>
>>>
>>>     _______________________________________________
>>>     datatable-help mailing list
>>>     datatable-help at lists.r-forge.r-project.org  <mailto:datatable-help at lists.r-forge.r-project.org>
>>>     https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
>>
>>
>
>
>
> _______________________________________________
> 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

-- 
Melanie BACOU
International Food Policy Research Institute
Agricultural Economist, HarvestChoice
Work +1(202)862-5699
E-mail mel at mbacou.com
Visit harvestchoice.org

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20140214/0e2b1d62/attachment.html>


More information about the datatable-help mailing list