数据帧D1中的分类变量V1可以具有由字母A到Z表示的值。我想创建一个子集D2,其中不包括某些值,例如B,N和T。基本上,我想要一个命令相反的 %in%
D2 = subset(D1, V1 %in% c('B','N',T'))
—
Chase
数据帧D1中的分类变量V1可以具有由字母A到Z表示的值。我想创建一个子集D2,其中不包括某些值,例如B,N和T。基本上,我想要一个命令相反的 %in%
D2 = subset(D1, V1 %in% c('B','N',T'))
Answers:
您可以使用!
运算符从根本上将任何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
?"%in%"
调用了new运算符%w/o%
。
?Negate
如"%ni%" <- Negate("%in%")
subset(df, variable %ni% c("A", "B"))
subset(df, variable Negate("%in%") c("A", "B"))
%
。要创建运算符,您需要将一个具有两个操作数的函数分配给以和开头的名称%
。
怎么样:
'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 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
使用negate
from purrr
也可以快速而巧妙地完成技巧:
`%not_in%` <- purrr::negate(`%in%`)
那么用法是,例如
c("cat", "dog") %not_in% c("dog", "mouse")
Negate
可以做到这一点。唯一的区别是purrr调用as_mapper
您传递的事物,而Negate
call 则调用match.fun
。rdocumentation.org/packages/purrr/versions/0.2.5/topics/... stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun.html
Hmisc具有%nin%
功能,应该执行此操作。
https://www.rdocumentation.org/packages/Hmisc/versions/4.4-0/topics/%25nin%25
require(TSDT)
c(1,3,11) %nin% 1:10
# [1] FALSE FALSE TRUE
有关更多信息,您可以参考:https : //cran.r-project.org/web/packages/TSDT/TSDT.pdf
!(x %in% y)
)。有时候生活会很轻松……