如何从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)]
使用包purrr
和margrittr
,你可以这样做:
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,但可能不是一个单一的元素。