如何从向量中删除多个值?

时间:2012-03-12 11:11:47

标签: r

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

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

此刻我循环向量并执行以下操作:

a[!a=NUMBER_TO_REMOVE]

但我认为有一个功能可以自动完成。

8 个答案:

答案 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

请注意,这会默默地删除不兼容的内容(例如NAInf)之类的内容(虽然它会在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,您必须同时检查-Infsign

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

使用包purrrmargrittr,您可以执行以下操作:

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