1. ホーム
  2. r

[解決済み] ベクトルから複数の値を削除するには?

2022-02-26 19:32:15

質問

のようなベクトルを持っています。 a = c(1:10) というように、複数の値を削除する必要があります。 2, 3, 5

これらの数字を削除する方法(それらは NOT ベクター内の位置)をベクターで表示しますか?

今のところ、ベクターをループさせて、次のようなことをしています。

a[!a=NUMBER_TO_REMOVE]

でも、自動でやってくれる機能があると思うんです。

どのように解決するのですか?

その %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 にリストされていない限りは 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 必要 というのも、incompareablesはどうせマッチしないので、可読性のために入れておきます。
    これって、ちなみに setdiff は内部で行っています(ただし unique で重複を捨てるために a にないものは remove ).

  • もし remove には比較できないものが含まれているので、それらを個別にチェックする必要があります。

    if (any (is.na (remove))) 
      a <- a [! is.na (a)]
    
    

    (を区別するものではありません。 NA から NaN しかし、Rマニュアルでは、これらの間に違いがあることに依存してはいけないと警告しています)

    について Inf / -Inf の両方をチェックする必要があります。 signis.finite