数据帧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)
小智 53
怎么样:
'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
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
下面是使用一个版本filter中dplyr适用相同的技术通过否定逻辑与接受的答案!
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)
小智 8
与其创建自己的函数,不如只否定
needle %in% haystack
Run Code Online (Sandbox Code Playgroud)
这样做:
!(needle %in% haystack)
Run Code Online (Sandbox Code Playgroud)
这也有效。
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是您想要的子集。