%中的%的反义词:排除在vector中指定值的行

数据帧D1中的分类变量V1可以有从A到z的字母表示的值。我想创建一个子集D2,其中不包括一些值,比如B、N和t。基本上,我想要一个与%in%相反的命令

D2 = subset(D1, V1 %in% c("B", "N", "T"))
452970 次浏览

你可以使用!操作符将任何TRUE设为FALSE,每一个FALSE设为TRUE。所以:

D2 = subset(D1, !(V1 %in% c('B','N','T')))
< p >编辑: 你也可以自己创建一个运算符:

'%!in%' <- function(x,y)!('%in%'(x,y))


c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE

如果你看%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

另一个解决方案可以使用setdiff

D1 = c("A",..., "Z") ; D0 = c("B","N","T")


D2 = setdiff(D1, D0)

D2是你想要的子集。

如何:

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

purrr::compose()是另一种用于以后使用的快速定义方法,如:

`%!in%` <- compose(`!`, `%in%`)

下面是在dplyr中使用filter的一个版本,它通过否定逻辑with !应用了与接受答案相同的技术:

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))

purrr中使用negate也可以快速而整洁地完成这个任务:

`%not_in%` <- purrr::negate(`%in%`)

例如,用法是,

c("cat", "dog") %not_in% c("dog", "mouse")

%in%, help("%in%")的帮助在Examples部分包括not in的定义,

"%w/o%" <- function(x, y) x[!x %in% y] #-- x without y

让我们试试吧:

c(2,3,4) %w/o% c(2,8,9)
[1] 3 4

另外

"%w/o%" <- function(x, y) !x %in% y #--  x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE  TRUE  TRUE
library(roperators)


1 %ni% 2:10

如果经常需要使用自定义中缀操作符,那么在包中使用中缀操作符比在每个脚本或项目中反复声明相同的函数更容易。

require(TSDT)


c(1,3,11) %nin% 1:10
# [1] FALSE FALSE  TRUE

有关更多信息,您可以参考:https://cran.r-project.org/web/packages/TSDT/TSDT.pdf

内置了它:%!in%

在Frank Harrell的R效用函数包中,他有一个%nin% (not In),它完全符合最初的问题。不需要重新发明轮子。