在数据框D1中,分类变量V1的值可以用字母A到Z表示。我想创建一个子集D2,其中排除一些值,比如B、N和T。基本上,我想要一个与%in%
相反的命令。
一个数据框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
?"%in%"
将会跳转到该页面),其中新操作符被称为 %w/o%
。 - IRTFM?Negate
例如,"%ni%" <- Negate("%in%")
- baptistesubset(df, variable %ni% c("A", "B"))
,但是直接使用时却无效,例如subset(df, variable Negate("%in%") c("A", "B"))
。 - PatrickTfilter(!(V1%in% c('B','N','T')))гАВ
- ah bon如何:
`%ni%` <- Negate(`%in%`)
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE TRUE
SPECIAL
%ni
的问题。 - Flash Thunder'
不是 \``,所以你应该使用
``。 - Flash Thunder这里是使用dplyr
中的filter
函数的版本,应用了与被接受答案相同的技术,通过否定逻辑运算符!实现:
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
!(x %in% y)
). 有时候生活可以很简单…… - Joris Meys