相对于%的%

dataframeD1中的分类variablesV1可以具有由从A到Z的字母表示的值。我想创build一个子集D2,它排除了某些值,比如B,N和T.基本上,我想要一个命令,它是与%in%相反%in%

 D2 = subset(D1, V1 %in% c('B','N',T')) 

你可以用! 操作员基本上做出任何TRUE FALSE和每个FALSE TRUE。 所以:

 D2 = subset(D1, !(V1 %in% c('B','N',T'))) 

编辑:你也可以让自己的操作员:

 '%!in%' <- function(x,y)!('%in%'(x,y)) c(1,3,11)%!in%1:10 [1] FALSE FALSE TRUE 

如果你看%in%的代码%in%

  function (x, table) match(x, table, nomatch = 0L) > 0L 

那么你应该可以写出你的相反版本。 我用

 `%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_)) 

另一种方法是:

 function (x, table) match(x, table, nomatch = 0L) == 0L 

怎么样:

  '%ni%' <- Negate('%in%') c(1,3,11)%ni%1:10 [1] FALSE FALSE TRUE 

那么,另一个解决scheme可能如下:

D1 = c(“A”,…,“Z”); D0 = c(“B”,“N”,“T”)

D2 = setdiff(D1,D0)

是你想要的子集。