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

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

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

现在我循环这个向量,然后做这样的动作:

a[!a=NUMBER_TO_REMOVE]

但我认为有一个函数可以自动完成。

285375 次浏览

%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中保留重复值,只要它们没有在 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)]
    

    (这并不能区分 NANaN,但是 R 手册警告人们不应该依赖于它们之间的差异)

    对于 Inf/-Inf,你必须同时检查 signis.finite

你可以使用 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<-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)]

更新:

以上所有的答案都不适用于重复的值,@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)

首先我们可以定义一个新的运算符,

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

而不是

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

使用 purrrmagrittr软件包,你可以:

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

这允许 subsetting 只使用一次向量名,并且您可以在管道中使用它:)

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设置为它显示为 false 的数字(NAN) 移除(q [ c (11,12,13)]) 如果你尝试这个,你会看到除去函数不工作的向量数。 去掉整个向量,但可能不是单个元素。

还有 subset,有时可能会有用:

a <- sample(1:10)
bad <- c(2, 3, 5)


> subset(a, !(a %in% bad))
[1]  9  7 10  6  8  1  4

试试这个功能

seq.int.exclude <- function(excluded, ...) {
x <- seq.int(...)
return(x[!(x %in% excluded)])
}

举例说明:

seq.int.exclude(from = 10L, to = 20L, excluded = c(12L, 30L, 19L))
seq.int.exclude(from = 10L, to = 20L, excluded = 15L)