回答:
%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
これにより、比較できないもの(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
比較できないものはとにかく一致しないので必要ありませんが、読みやすくするために含めます。
これは、ところで、setdiff
内部で行うことです(ただし、にないunique
複製を破棄する必要はa
ありませんremove
)。
remove
比類のないものが含まれている場合は、個別にチェックする必要があります。例:
if (any (is.na (remove)))
a <- a [! is.na (a)]
(これとは区別さNA
れませんNaN
が、Rマニュアルはとにかくそれらに違いがあることに頼るべきではないことを警告しています)
以下のためにInf
/ -Inf
あなたは両方をチェックする必要がありますsign
し、is.finite
a
とは限りませんremove
。重複していないものも削除されます。それが問題でない場合は、も使用できますsetdiff
。setdiff
、ところで、用途match
のためには%in%
ショートカットです。
使用できます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
a
あなたは1本のではなく3のラインと、一時変数で物事を行うことができますので、他の関数の結果である
%in%
、入力ベクトルに重複が含まれている場合(つまり、重複なしでsetdiff
一意のセットのみが返される場合)、ソリューションとは異なる結果を生成します
fsetdiff
のdata.table
パッケージにはall
、入力ベクトルの重複を維持できるフラグ(デフォルトはF)があります。
次のようにして行うことができます。
> 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)]
which
。基本的には@cbeleitesの回答と同じです。
which
TRUE値のインデックスを返します。したがって、マイナス記号は「これらのインデックス以外のインデックス」を表すために使用できます。またwhich
、自然言語に近いため読みやすくなります。
の代わりに
x <- x[! x %in% c(2,3,5)]
パッケージpurrr
とを使用するとmagrittr
、次のことができます。
your_vector %<>% discard(~ .x %in% c(2,3,5))
これによりsubset
、ベクター名を1回だけ使用できます。そして、あなたはパイプでそれを使うことができます:)
まず、新しい演算子を定義できます。
"%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)]
更新:
上記の回答はすべて、繰り返される値に対しては機能しません。duplicated()
述語を使用した@BenBolkerの回答はこれを解決します。
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)
。
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
ですか?
full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- 1, 1, 2
正解の代わりに生成されます1, 2
。
removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
subset
時々役立つかもしれないものもあります:
a <- sample(1:10)
bad <- c(2, 3, 5)
> subset(a, !(a %in% bad))
[1] 9 7 10 6 8 1 4
setdiff
1つの操作ですべてを行い、修正されたベクトルを1回だけ参照するため、より優れています。