330

数据框 D1 中的分类变量 V1 可以具有由 A 到 Z 的字母表示的值。我想创建一个子集 D2,它不包括某些值,例如 B、N 和 T。基本上,我想要一个命令相反的%in%

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

13 回答 13

439

您可以使用!运算符基本上使任何 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
于 2011-04-29T12:10:22.767 回答
90

怎么样:

`%ni%` <- Negate(`%in%`)
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE  TRUE
于 2017-10-21T20:24:45.050 回答
44

这是一个使用filterin的版本,dplyr它通过用 ! 否定逻辑来应用与接受的答案相同的技术:

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
于 2018-05-17T00:34:17.640 回答
34

如果你看一下代码%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
于 2011-04-29T13:16:22.210 回答
16

使用negatefrompurrr也可以快速而巧妙地完成技巧:

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

然后用法是,例如,

c("cat", "dog") %not_in% c("dog", "mouse")
于 2018-05-21T16:24:07.743 回答
9

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

`%!in%` <- compose(`!`, `%in%`)
于 2018-05-09T14:08:55.403 回答
5

另一种解决方案可能是使用setdiff

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

D2 = setdiff(D1, D0)

D2是您想要的子集。

于 2017-09-06T17:35:41.277 回答
2

Hmisc 有%nin%功能,应该这样做。

https://www.rdocumentation.org/packages/Hmisc/versions/4.4-0/topics/%25nin%25

于 2020-05-28T04:32:43.423 回答
1
library(roperators)

1 %ni% 2:10

如果您经常需要使用自定义中缀运算符,将它们放在一个包中比在每个脚本或项目中一遍又一遍地声明相同的确切函数更容易。

于 2020-05-07T00:21:37.713 回答
0

%in%, help("%in%"), 的帮助包括,在示例部分,这个 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
于 2019-03-03T10:59:21.187 回答
0
require(TSDT)

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

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

于 2020-06-19T09:26:04.550 回答
0

包折叠已内置:%!in%.

于 2020-09-30T14:26:38.707 回答
-1

在 Frank Harrell 的 R 实用函数包中,他有一个 %nin% (不在),它完全符合原始问题的要求。无需重新发明车轮。

于 2021-08-18T17:12:12.197 回答