R 与%in%相反:排除向量中指定值的行

R 与%in%相反:排除向量中指定值的行,r,dataframe,subset,R,Dataframe,Subset,数据帧D1中的分类变量V1可以具有从A到Z的字母表示的值。我想创建一个子集D2,它排除一些值,例如B、N和T。基本上,我想要一个与%%中的%相反的命令 D2 = subset(D1, V1 %in% c("B", "N", "T")) function (x, table) match(x, table, nomatch = 0L) > 0L 您可以使用操作符,基本上使任何一个为真,每一个为假。因此: D2 = subset

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

D2 = subset(D1, V1 %in% c("B", "N", "T"))
 function (x, table) match(x, table, nomatch = 0L) > 0L

您可以使用
操作符,基本上使任何一个为真,每一个为假。因此:

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

”%!如果您查看%

D2 = subset(D1, V1 %in% c("B", "N", "T"))
 function (x, table) match(x, table, nomatch = 0L) > 0L
然后你应该能够写出你的相反版本。我用

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

另一种解决方案可以是使用
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
'%ni%'
purrr::compose()
是另一种快速定义此项以供以后使用的方法,如:

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

`%!在%`中,这里有一个版本使用了
dplyr
中的
filter
,该版本采用了与接受答案相同的技术,即用!否定逻辑:

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
D2%dplyr::过滤器(!V1%in%c('B','N','T'))
使用from也可以快速、简洁地完成以下任务:

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

%in%,
帮助(“%in%”
)的帮助在“示例”部分中包括“不在”的定义

%w/o%

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

Hmisc有
%nin%
函数,应该可以做到这一点


有关更多信息,请参阅:

这对我来说很好:

`%nin%` <- Negate(`%in%`)

`%nin%`包崩溃内置了它:
%!在%

中,只否定

needle %in% haystack 
改为这样做:

!(needle %in% haystack)

这同样有效。

不是%中的%?(
!(x%在%y中)
)。有时生活可能很简单……第二个选项的使用可能重复出现在帮助(匹配)页面中(如果您键入
?%in%”
,您将进入该页面),在该页面中,新运算符被称为
%w/o%
。另外,请参见
?否定
,例如定义新运算符后使用
,%ni%“否定”对我有效,正如巴普蒂斯特所建议的,例如
子集(df,变量%ni%c(“A”,“B”))
,但在直接使用时,例如
子集(df,变量Negate(“%in%”)c(“A”,“B”))
@PatrickT,这是因为只有运算符可以用作运算符。和运算符是内置的或以
%
开头和结尾。要创建运算符,您需要将一个具有两个操作数的函数分配给一个以
%
开头和结尾的名称。我们还可以使用
过滤器(!(V1%in%c('B','N','T'))
。还有一个内置的
求反
也可以执行相同的操作。唯一的区别是purr调用
作为你传递的东西的映射器,而
否定
调用
match.fun
。虽然这可能是一个正确的答案,但如果能对其工作原理进行更多的解释,这将更加有用。考虑编辑它包含更多的细节,如果你觉得它比近十年前发布的公认答案更好。有时它可能有用,但如果是重复的话,它不会产生相同的结果。这一个实际上不起作用,因为它抛出了一个错误关于
特殊的
%ni
仍然可以正常工作。R版本4.0.3(2020-10-10)平台:x86_64-apple-darwin17.0(64位),运行于:macOS Big Sur 10.16下,因为
不是
`
,您应该使用
`
require(TSDT)

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