私の質問は、Rの==
演算子と%in%
演算子の実際的な違いに関係しています。
どちらかの演算子を使用したフィルタリングで異なる結果が得られる職場でのインスタンスに遭遇しました(たとえば、1つの結果は800行で、もう1つの結果は1200)。私は過去にこの問題に遭遇したことがあり、希望する結果が確実に得られるように検証することができます。しかし、私はまだそれらがどのように違うのかについて困惑しています。
誰かがこれらの演算子がどのように異なるかについていくつかの光を当てることができますか?
_%in%
_は値の一致であり、「最初の引数の2番目の引数の(最初の)一致の位置のベクトルを返します」(help('%in%')
を参照)これは、異なる長さのベクトルを比較して、1つのベクトルの要素が別のベクトルの少なくとも1つの要素と一致するかどうかを確認します。出力の長さは、比較されるベクトル(最初のもの)の長さと等しくなります。
_1:2 %in% rep(1:2,5)
#[1] TRUE TRUE
rep(1:2,5) %in% 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#Note this output is longer in second
_
_==
_は論理演算子は、2つのものが完全に等しいかどうかを比較するためのものです。ベクトルの長さが等しい場合、要素は要素ごとに比較されます。そうでない場合、ベクターはリサイクルされます。出力の長さは、長い方のベクトルの長さと等しくなります。
_1:2 == rep(1:2,5)
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
rep(1:2,5) == 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
_
_1:10 %in% 3:7
#[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
#is same as
sapply(1:10, function(a) any(a == 3:7))
#[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
_
注:可能であれば、_all.equal
_の代わりにidentical
または_==
_を使用してみてください。
長さの異なるオブジェクトに試してください。
ac <- c("a", "b", "c")
ae <- c("a", "b", "c", "d", "e")
ac %in% ae
[1] TRUE TRUE TRUE
ac == ae
[1] TRUE TRUE TRUE FALSE FALSE
%in%
は、オブジェクトが他のオブジェクトに含まれているかどうかをチェックします。一方、==
は、アイデンティティプロパティをチェックする論理演算子です。
2つのベクトルxとyが与えられた場合、コードx == yは、xの最初の要素をyの最初の要素と比較し、次にxの2番目の要素をyの2番目の要素と比較します。オン。 x == yを使用する場合、xとyの長さは同じでなければなりません。ここで、compareは「等しい」を意味するため、出力はx(またはy)の長さに等しい論理ベクトルです。
コードx%in%yでは、xの最初の要素がy-のall要素と比較され、次にxの2番目の要素がallと比較されます。 yの要素など。ここで、compareは「xの現在の要素がyの任意の値と等しい」ことを意味します。したがって、出力はxと同じ長さであり、(必ずしも)yではない論理ベクトルです。
違いを示すコードスニペットを次に示します。 xとyは同じ長さですが、yの要素はxの要素の順序が異なることに注意してください。最後の例でも、xは、26要素を含むlettersベクトルと比較される3要素ベクトルであることに注意してください。
> x <- c('a','b','c')
> y <- c('c', 'b', 'a')
> x == y
[1] FALSE TRUE FALSE
> x %in% y
[1] TRUE TRUE TRUE
> x %in% letters
[1] TRUE TRUE TRUE
> letters %in% x
[1] TRUE TRUE TRUE FALSE FALSE FALSE
[7] FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE
==
ベクトルの要素が別のベクトルのすべての要素と等しい場合はチェックします。理想的には、2つのベクトルは同じサイズになります(または、サイズがRと一致しない場合、予期しない結果が発生し、サイズが互いに倍数の場合、サイレントで短いベクトルがリサイクルされます)。例えば
c(1,2,3) == c(1,3,2)
[1] TRUE FALSE FALSE
または
c(1,2) == c(1,3,2)
[1] TRUE FALSE FALSE
Warning message:
In c(1, 2) == c(1, 3, 2) :
longer object length is not a multiple of shorter object length
%in%
一方、リスト1のどの要素がリスト2に含まれているかをチェックします
c(1,2,3) %in% c(1,3,2)
[1] TRUE TRUE TRUE
または
c(1,2) %in% c(1,3,2)
[1] TRUE TRUE