R 与%in%相反:排除向量中指定值的行
数据帧D1中的分类变量V1可以具有从A到Z的字母表示的值。我想创建一个子集D2,它排除一些值,例如B、N和T。基本上,我想要一个与%%中的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
%相反的命令
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)