[R] Vectorized forms of isTRUE, identical and all.equal?

Steve Lianoglou mailinglist.honeypot at gmail.com
Thu Apr 8 01:27:53 CEST 2010


On Wed, Apr 7, 2010 at 7:16 PM, Robin Evans <rje42 at stat.washington.edu> wrote:
> On 7 April 2010 16:12, Steve Lianoglou <mailinglist.honeypot at gmail.com> wrote:
>> Hi,
>>
>> On Wed, Apr 7, 2010 at 5:44 PM, Robin Evans <rje42 at stat.washington.edu> wrote:
>>> Dear all,
>>>
>>> I'm wondering if there exist vectorized forms of 'isTRUE()',
>>> 'identical()' and 'all.equal()'.  My problem is that I wish to test if
>>> each element of a vector is equal to a particular value (or
>>> numerically close), whilst dealing carefully with NAs and so on.
>>> However, using sapply() with identical() is very slow because it makes
>>> so many separate function calls:
>>>
>>> x = rbinom(1e4, 1, 0.5)
>>>
>>> system.time(sapply(x, function(x) isTRUE(all.equal(x, 0))))
>>>
>>> system.time(abs(x)  < .Machine$double.eps^0.5)
>>>
>>> The latter version is fast, but potentially dangerous.  Any suggestions?
>>
>> Why is it dangerous? Because some values in x can be NA?
>>
> Precisely - I would like all the answers to be TRUE or FALSE.

What happens when the value @ x is NA, though?

Here's a function for you:

almost.equal <- function (x, y, tolerance=.Machine$double.eps^0.5,
na.value=TRUE)
{
  answer <- rep(na.value, length(x))
  test <- !is.na(x)
  answer[test] <- abs(x[test] - y) < tolerance
  answer
}

Now depending on what you want the answer to default to in the
locations that x is NA, set that in the `na.value`.

Be careful the types of things you pass in as x and y:

R> head(x)
[1]    NA 1e+00 1e-16 0e+00 1e+00 1e+00

R> head(almost.equal(x, 0))
[1]  TRUE FALSE  TRUE  TRUE FALSE FALSE

R> head(almost.equal(x, 0, na.value=FALSE))
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

-- 
Steve Lianoglou
Graduate Student: Computational Systems Biology
 | Memorial Sloan-Kettering Cancer Center
 | Weill Medical College of Cornell University
Contact Info: http://cbio.mskcc.org/~lianos/contact



More information about the R-help mailing list