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

Dai*_*ail 114 r

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

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

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

a[!a=NUMBER_TO_REMOVE]
Run Code Online (Sandbox Code Playgroud)

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

cbe*_*ica 178

%in%运营商告诉您哪些元素是numers删除其中:

> 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
Run Code Online (Sandbox Code Playgroud)

请注意,这将默默地删除不兼容的东西(类似NA或类似的东西Inf)(虽然它将保留重复值,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
    
    Run Code Online (Sandbox Code Playgroud)

    incomparables = 0是不是需要为incomparables将反正不匹配,但我包括它可读性的原因.
    这,顺便说一句,什么setdiff内部做(但没有unique扔掉重复在a其不在remove).

  • 如果remove包含不兼容的内容,则必须单独检查它们,例如

    if (any (is.na (remove))) 
      a <- a [! is.na (a)]
    
    Run Code Online (Sandbox Code Playgroud)

    (这没有区别NA,NaN但R手册反正警告说不应该依赖它们之间的区别)

    Inf/ -Inf你必须检查两个signis.finite

  • `setdiff` 更好,因为它在一个操作中完成所有操作,并且只引用一次修改后的向量。 (2认同)

Bri*_*ggs 92

你可以用setdiff.

特定

a <- sample(1:10)
remove <- c(2, 3, 5)
Run Code Online (Sandbox Code Playgroud)

然后

> a
 [1] 10  8  9  1  3  4  6  7  2  5
> setdiff(a, remove)
[1] 10  8  9  1  4  6  7
Run Code Online (Sandbox Code Playgroud)

  • 如果输入向量包含重复项,则会产生与`%in%'解决方案不同的结果(在这种情况下,`setdiff`将只返回唯一的_set_,即没有重复) (12认同)
  • @docendodiscimus:`data.table` 包的 `fsetdiff` 有一个 `all` 标志(默认 F),允许在输入向量中保留重复项。 (2认同)

ykp*_*mre 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
Run Code Online (Sandbox Code Playgroud)

不久

> x = x[ - which(x %in% y)]
Run Code Online (Sandbox Code Playgroud)


小智 7

代替

x <- x[! x %in% c(2,3,5)]
Run Code Online (Sandbox Code Playgroud)

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

your_vector %<>% discard(~ .x %in% c(2,3,5))
Run Code Online (Sandbox Code Playgroud)

这允许subset仅使用向量名称一次。你可以在管道中使用它:)