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.table
package带有一个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
更好,因为它一次完成所有操作,并且只引用修改过的向量一次。