我有一个像a = c(1:10)
这样的向量,我需要删除多个值,例如:2, 3, 5
如何在向量中删除这些数字(它们是不向量中的位置)?
此刻我循环向量并执行以下操作:
a[!a=NUMBER_TO_REMOVE]
但我认为有一个功能可以自动完成。
答案 0 :(得分:173)
%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
请注意,这会默默地删除不兼容的内容(例如NA
或Inf)
之类的内容(虽然它会在a
中保留重复值,只要它们未在{{1}中列出}})。
如果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
中的重复项。
如果remove
包含不兼容的内容,则必须单独检查,例如
remove
(这不会将if (any (is.na (remove)))
a <- a [! is.na (a)]
与NA
区分开来,但R手册仍然会警告人们不应该依赖它们之间的差异。
对于NaN
/ Inf
,您必须同时检查-Inf
和sign
答案 1 :(得分:87)
您可以使用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
答案 2 :(得分:6)
您可以按照以下方式执行此操作:
> 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)]
答案 3 :(得分:3)
而不是
x <- x[! x %in% c(2,3,5)]
使用包purrr
和margrittr
,您可以执行以下操作:
your_vector %<>% discard(~ .x %in% c(2,3,5))
这允许仅使用向量名称进行一次子集化。你可以在管道中使用它:)
答案 4 :(得分:2)
首先我们可以定义一个新的运算符
"%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)]
答案 5 :(得分:1)
<强>更新强>
以上所有答案都不适用于重复值,@ 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)
。
答案 6 :(得分:1)
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),它显示为false 除去(Q [C(11,12,13)]) 如果你试试这个,你会发现删除功能对矢量编号不起作用。 你删除整个矢量但可能不是一个元素。
答案 7 :(得分:0)
还有subset
有时可能会有用:
a <- sample(1:10)
bad <- c(2, 3, 5)
> subset(a, !(a %in% bad))
[1] 9 7 10 6 8 1 4