匹配否定表达式

9
这很简单,但我似乎找不到它。我知道R有%in%的否定版本,返回"not in"。显然,我可以使用!(x %in% y),但语言包括一个已经否定的构造,我想使用它。
那么这个函数是什么?搜索和%nin%以及%notin%都失败了。
如果您使用以下示例数据对您的答案与!(x %in% y)进行基准测试,则会得到奖励。
x <- sample( sample(letters,5), 10^3, replace=TRUE)
y <- sample( letters, 10^5, replace=TRUE)

1
我认为它不会。我只是使用“Negate”创建自己的。 - joran
这就引出了一个问题:Negate 操作符是比 ! 操作符更快还是更慢?但说真的,我记得以前见过它。 - Ari B. Friedman
1
哦,那些讨厌的包。而且你是对的...我已经包含了括号以便于(至少对我来说)清晰明了这么长时间了,我忘记了运算顺序使它们变得多余。请原谅我的可恶疏忽。 - Ari B. Friedman
@ttmaccer 是的,这就是为什么我喜欢我的版本:'%ni%' <- Negate('%in%')。非常简单。 - joran
我之前已经回答过这个问题,至少在两个地方,这里是其中之一。不过这也是 Stack Overflow 搜索似乎失败的一个领域。我希望我们能把所有正确的搜索词都放在一个地方,这样就可以更容易地找到它了。 - Chase
显示剩余4条评论
1个回答

15

只是出于兴趣。定义

"%w/o%" <- function(x, y) x[!x %in% y] 
'%ni%' <- Negate('%in%')

> benchmark(y[y%ni%x], y%w/o%x,replications=1000)
         test replications elapsed relative user.self sys.self user.child
2   y %w/o% x         1000    5.32 1.000000      4.60     0.70         NA
1 y[y %ni% x]         1000    5.34 1.003759      4.68     0.65         NA
  sys.child
2        NA
1        NA

我能得到一个饼干吗?


2
你因为 benchmark(y[y%ni%x], y%w/o%x) 获得了一个饼干。你能编辑吗? - Dirk Eddelbuettel
这基本上可以忽略不计 -- 0.3% 的差异是测量误差。但是做得很好。 - Dirk Eddelbuettel
1
但是,也许因为在函数名称中有一个“/”,会失去一个cookie? :-) - Ari B. Friedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接