如何从vector中删除多个值?

我有一个向量,如: a = c(1:10) ,我需要删除多个值,如: 2, 3, 5

如何在向量中删除这些数字(它们不是向量中的位置)?

此刻我循环载体,并做一些事情:

 a[!a=NUMBER_TO_REMOVE] 

但我认为有一个function,它自动执行。

%in%运算符%in%告诉你哪些元素是要删除的数字之一:

 > 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 

你可以使用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 
 x <- list("a", "b", "c", "d", "e"); # example list x[-2]; # without 2nd element x[-c(2, 3, 5)]; # without 2nd,3rd,5th element 

你可以这样做:

 > 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)] 

首先我们可以定义一个新的操作符,

 "%ni%" = Negate( "%in%" ) 

那么,它的x就不会被删除

 x <- 1:10 remove <- c(2,3,5) x <- x[ x %ni% remove ] 

或者为什么去除,直接去

 x <- x[ x %ni% c(2,3,5)] 

更新:

以上所有答案都不适用于重复的值,@ BenBolker的答案使用duplicated()谓词解决了这个问题:

 full_vector[!full_vector %in% searched_vector | duplicated(full_vector)] 

原来的答案:在这里我写了一个小function:

 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)full_vector=c(1,2,3,4,1) searched_vector=c(1,2,3)

exclude_val(full_vector,searched_vector)将返回(4,1),但是上面的答案只会返回(4)

代替

 x <- x[! x %in% c(2,3,5)] 

使用包purrrmargrittr ,你可以这样做:

 your_vector %<>% discard(~ .x %in% c(2,3,5)) 

这允许仅使用向量名称进行一次子集化。 你可以在pipe道中使用它:)

 q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7) rm <- q[11] remove(rm) q q[13] = NaN q q %in% 7 

这将向量中的13设置为不是数字(NAN)它显示假删除(q [c(11,12,13)])如果您尝试此操作,您将看到删除函数不适用于向量编号。 你删除整个vector,但可能不是一个单一的元素。