[R] %in% operator - NOT IN

(Ted Harding) ted.harding at wlandres.net
Sun May 8 11:35:07 CEST 2011


On 08-May-11 09:18:55, Berwin A Turlach wrote:
> G'day Dan,
> 
> On Sun, 8 May 2011 05:06:27 -0400
> Dan Abner <dan.abner99 at gmail.com> wrote:
> 
>> Hello everyone,
>> I am attempting to use the %in% operator with the ! to produce
>> a NOT IN type of operation. Why does this not work? Suggestions?
>> 
>> > data2[data1$char1 %in% c("string1","string2"),1]<-min(data1$x1)
>> > data2[data1$char1 ! %in%
>> > c("string1","string2"),1]<-max(data1$x1)+1000
>> 
>> Error: unexpected '!' in "data2[data1$char1 !"
> 
> Try (untested)
> 
> R> data2[!(data1$char1 %in%
> c("string1","string2")),1]<-max(data1$x1)+1000 
> 
> HTH.
> Cheers,
>       Berwin

Berwin's suggestion should work -- it is the general way to
negate the result of an "%in".

As to "Why does this not work?", the point to note is that
"%in%" is a binary operator. If you enter
  ?"%in%"
you will be taken to the help page for "match", where it is
pointed out that:

  ?%in%? is a more intuitive interface as a binary operator,
  which returns a logical vector indicating if there is a
  match or not for its left operand.

Specifically, therefore, the syntax of "%in%" requires

  X %in% Y

where X and Y are objects to which the functional definition
of %in% applies (see the same help page):

  '%in%' is currently defined as
  '"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0'

In your expression (effectively "X ! %in% Y") the item which
immediately precedes "%in%" is the "!", and this is not a
valid item!

Based on the above functional definition, you could define
your own binary operator "%!in%" as

"%!in%" <- function(x,table) match(x,table, nomatch = 0) == 0

or similar -- I have not tested this so cannot guarantee it!
However, it is the way to proceed if you want a "NOT IN".
Then the usage could be:

data2[data1$char1 %!in% c("string1","string2"),1]<-max(data1$x1)+1000

Hoping ths helps,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <ted.harding at wlandres.net>
Fax-to-email: +44 (0)870 094 0861
Date: 08-May-11                                       Time: 10:35:05
------------------------------ XFMail ------------------------------



More information about the R-help mailing list