数据框 D1 中的分类变量 V1 可以具有由 A 到 Z 的字母表示的值。我想创建一个子集 D2,它不包括某些值,例如 B、N 和 T。基本上,我想要一个命令相反的%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
怎么样:
`%ni%` <- Negate(`%in%`)
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE TRUE
这是一个使用filter
in的版本,dplyr
它通过用 ! 否定逻辑来应用与接受的答案相同的技术:
D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
如果你看一下代码%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
purrr::compose()
是另一种快速定义它以供以后使用的方法,如:
`%!in%` <- compose(`!`, `%in%`)
另一种解决方案可能是使用setdiff
D1 = c("A",..., "Z") ; D0 = c("B","N","T")
D2 = setdiff(D1, D0)
D2
是您想要的子集。
Hmisc 有%nin%
功能,应该这样做。
https://www.rdocumentation.org/packages/Hmisc/versions/4.4-0/topics/%25nin%25
library(roperators)
1 %ni% 2:10
如果您经常需要使用自定义中缀运算符,将它们放在一个包中比在每个脚本或项目中一遍又一遍地声明相同的确切函数更容易。
%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
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% (不在),它完全符合原始问题的要求。无需重新发明车轮。