Answers:
该%in%运营商告诉您哪些元素是numers以去除其中:
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
请注意,这将无声地删除不可比的值(类似NA或Inf)一样的东西(a只要它们未在中列出,它将保留重复的值remove)。
如果a可以包含无与伦比,remove则可以使用match,告诉它返回0不匹配和不可比较的内容(这%in%是的便利快捷方式match):
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
incomparables = 0是不是需要它因为无与伦比的匹配将是不匹配的,但是出于可读性考虑,我将其包括在内。
顺便说一句,这setdiff是内部执行的操作(但不unique丢弃a不包含in的重复项remove)。
如果remove包含无与伦比的商品,则必须单独检查它们,例如
if (any (is.na (remove)))
a <- a [! is.na (a)]
(这NA与NaN但R手册始终警告说,不应依赖于两者之间的差异)
对于Inf/,-Inf您必须同时检查sign和is.finite
a不在其中的重复项remove。如果那不是问题,您也可以使用setdiff。setdiff,顺便说一句,使用match它%in%是一个快捷方式。
您可以使用 setdiff。
给定
a <- sample(1:10)
remove <- c(2, 3, 5)
然后
> a
[1] 10 8 9 1 3 4 6 7 2 5
> setdiff(a, remove)
[1] 10 8 9 1 4 6 7
a另一个函数的结果何时非常有用,因此您可以一行而不是3和一个temp变量来处理事情
%in%如果输入向量包含重复项,则将产生与解决方案不同的结果(在这种情况下,setdiff将仅返回唯一的集合,即没有重复项)
fsetdiff的data.tablepackage带有一个all标志(默认F),该标志允许将重复项保留在输入向量中。
您可以按照以下步骤进行操作:
> x<-c(2, 4, 6, 9, 10) # the list
> y<-c(4, 9, 10) # values to be removed
> idx = which(x %in% y ) # Positions of the values of y in x
> idx
[1] 2 4 5
> x = x[-idx] # Remove those values using their position and "-" operator
> x
[1] 2 6
不久
> x = x[ - which(x %in% y)]
which。它基本上与@cbeleites答案相同。
which返回TRUE值的索引。因此减号可以用来表示“这些索引以外的索引”。which由于它更接近自然语言,因此也更具可读性。
代替
x <- x[! x %in% c(2,3,5)]
使用包purrr和magrittr,你可以这样做:
your_vector %<>% discard(~ .x %in% c(2,3,5))
这仅允许subset一次使用向量名称。您可以在管道中使用它:)
更新:
以上所有答案均不适用于重复值,@ BenBolker的使用duplicated()谓词的答案可解决此问题:
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
原始答案: 在这里,我为此编写了一个小函数:
exclude_val<-function(full_vector,searched_vector){
found=c()
for(i in full_vector){
if(any(is.element(searched_vector,i))){
searched_vector[(which(searched_vector==i))[1]]=NA
}
else{
found=c(found,i)
}
}
return(found)
}
所以,我们说full_vector=c(1,2,3,4,1)和searched_vector=c(1,2,3)。
exclude_val(full_vector,searched_vector)将返回(4,1),但是以上答案将仅返回(4)。
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]呢?
full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);-产生1, 1, 2而不是正确的答案1, 2。
removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
subset有时也可能有用:
a <- sample(1:10)
bad <- c(2, 3, 5)
> subset(a, !(a %in% bad))
[1] 9 7 10 6 8 1 4
setdiff更好,因为它一次完成所有操作,并且只引用修改过的向量一次。