与%相反的百分比

use*_*432 226 r

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

D2 = subset(D1, V1 %in% c('B','N',T'))
Run Code Online (Sandbox Code Playgroud)

Sac*_*amp 299

您可以使用!运算符基本上使任何TRUE FALSE和每个FALSE TRUE.所以:

D2 = subset(D1, !(V1 %in% c('B','N','T')))
Run Code Online (Sandbox Code Playgroud)

编辑:你也可以自己做一个操作员:

'%!in%' <- function(x,y)!('%in%'(x,y))

c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

  • 另外,请参阅`?否定',例如`"%ni%"< - 否定("%in%")` (20认同)
  • 第二个选项的使用在帮助(匹配)页面中进行了说明(如果你在%"`中输入`?%%',你会得到这个选项,其中new运算符被称为`%w/o%`. (5认同)
  • 我们还可以使用`filter(!(V1%in% c('B','N','T')))`。 (3认同)
  • 在定义new运算符之后使用Negate,如baptiste所示,例如``subset(df,变量%ni%c("A","B"))``,但不是直接使用时,例如` ```子集(df,变量否定("%in%")c("A","B"))```` (2认同)
  • @PatrickT,因为只能将运算符用作运算符。并且运算符是内置的或以“%”开头和结尾。要创建运算符,您需要将一个具有两个操作数的函数分配给以“%”开头和结尾的名称。 (2认同)

小智 53

怎么样:

'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

  • 我给了这个答案[这里](/sf/answers/2684644581/) (4认同)
  • 因为 '' 不是 '\',你应该使用 '\`` (4认同)

Mar*_*rek 31

如果你看一下代码 %in%

 function (x, table) match(x, table, nomatch = 0L) > 0L
Run Code Online (Sandbox Code Playgroud)

那么你应该能够写出你的版本.我用

`%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_))
Run Code Online (Sandbox Code Playgroud)

另一种方式是:

function (x, table) match(x, table, nomatch = 0L) == 0L
Run Code Online (Sandbox Code Playgroud)


use*_*609 14

下面是使用一个版本filterdplyr适用相同的技术通过否定逻辑与接受的答案!

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
Run Code Online (Sandbox Code Playgroud)


Ell*_*laK 11

使用negatefrom purrr也快速而整洁地完成了这个过程:

`%not_in%` <- purrr::negate(`%in%`)
Run Code Online (Sandbox Code Playgroud)

然后用法是,例如,

c("cat", "dog") %not_in% c("dog", "mouse")
Run Code Online (Sandbox Code Playgroud)

  • 还有一个内置的 `Negate` 可以做同样的事情。唯一的区别是 purrr 在你传递的东西上调用 `as_mapper`,而 `Negate` 调用 `match.fun`。https://www.rdocumentation.org/packages/purrr/versions/0.2.5/topics/as_mapper https://stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun .html (3认同)

小智 8

与其创建自己的函数,不如只否定

needle %in% haystack 
Run Code Online (Sandbox Code Playgroud)

这样做:

!(needle %in% haystack)
Run Code Online (Sandbox Code Playgroud)

这也有效。


eda*_*aja 7

purrr::compose() 是另一种快速定义它以供以后使用的方法,如:

`%!in%` <- compose(`!`, `%in%`)
Run Code Online (Sandbox Code Playgroud)


小智 6

另一种解决方案可以使用setdiff

D1 = c("A",..., "Z") ; D0 = c("B","N","T")

D2 = setdiff(D1, D0)
Run Code Online (Sandbox Code Playgroud)

D2是您想要的子集。