数据帧D1中的分类变量V1可以有从A到z的字母表示的值。我想创建一个子集D2,其中不包括一些值,比如B、N和t。基本上,我想要一个与%中的%相反的命令
D2 = subset(D1, V1 %in% c("B", "N", "T"))
数据帧D1中的分类变量V1可以有从A到z的字母表示的值。我想创建一个子集D2,其中不包括一些值,比如B、N和t。基本上,我想要一个与%中的%相反的命令
D2 = subset(D1, V1 %in% c("B", "N", "T"))
当前回答
下面是在dplyr中使用过滤器的一个版本,它通过否定逻辑with !应用了与接受答案相同的技术:
D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
其他回答
另一个解决方案是使用setdiff
D1 = c("A",..., "Z") ; D0 = c("B","N","T")
D2 = setdiff(D1, D0)
D2是你想要的子集。
如果你看%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
下面是在dplyr中使用过滤器的一个版本,它通过否定逻辑with !应用了与接受答案相同的技术:
D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
Hmisc有%nin%函数,它应该做到这一点。
https://www.rdocumentation.org/packages/Hmisc/versions/4.4-0/topics/%25nin%25
对于%in%的帮助,help("%in%"),在示例部分中包含了not in的定义,
"%w/o%" <-函数(x, y) x[!X %in% y] #——X不含y
让我们试试吧:
c(2,3,4) %w/o% c(2,8,9)
[1] 3 4
另外
"%w/o%" <- function(x, y) !x %in% y #-- x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE TRUE TRUE