Rでデータのサブセットを選択する場合は、サブセット関数を使用できます。いくつかの基準の1つに一致するデータに基づいて分析を行いたいと考えました。特定の変数が1、2、3のいずれかであることを確認しました
myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))
最初の基準、ここでは1に一致する値を常に選択していました。私の想定では、1から始まり、「false」と評価された場合は2になり、3に評価されない場合、 ==の後のステートメントは「false」であり、それらの1つが一致する場合は「true」です。
私は使用して正しい結果を得ました
newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))
しかし、論理演算子を使用してデータを選択できるようにしたいので、なぜ最初のアプローチが機能しなかったのですか?
正しい演算子は、ここでは_%in%
_です。ダミーデータの例を次に示します。
_set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
foo = runif(10))
_
与える:
_> head(dat)
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
4 4 0.3841037
5 1 0.7698414
6 4 0.4976992
_
_bf11
_がセットのいずれかに等しいdat
のサブセット_1,2,3
_は、_%in%
_を使用して次のように解釈されます。
_> subset(dat, subset = bf11 %in% c(1,2,3))
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
5 1 0.7698414
8 3 0.9919061
9 3 0.3800352
10 1 0.7774452
_
オリジナルが機能しなかった理由については、それを分解して問題を確認してください。 _1||2||3
_の評価結果を見てください。
_> 1 || 2 || 3
[1] TRUE
_
代わりに_|
_を使用しても同じ結果が得られます。その結果、subset()
呼び出しは、_bf11
_がTRUE
(またはTRUE
と評価されたもの)である行のみを返します。
あなたが書いたものは次のようなものになります:
_subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
_
これは、以前のsubset()
呼び出しと同じ結果になります。ポイントは、一連のオプションの比較ではなく、一連の単一の比較が必要なことです。しかし、ご覧のとおり、このような状況では_%in%
_の方がはるかに便利で、冗長ではありません。 _|
_の各要素を_bf11
_、_1
_、および_2
_と順に比較するため、_3
_を使用する必要があることにも注意してください。比較:
_> with(dat, bf11 == 1 || bf11 == 2)
[1] TRUE
> with(dat, bf11 == 1 | bf11 == 2)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
_
あなたの例として、私は以下がうまくいくと信じています:
myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
詳細については、?subset
の例を参照してください。実例を示すと、より複雑な論理サブセットは次のようになります。
data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)
そしてチェイスが指摘するように、あなたの例では%in%
がより効率的です:
myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))
Chaseも指摘しているように、|
と||
の違いを必ず理解してください。演算子のヘルプページを表示するには、演算子を引用符で囲んだ?'||'
を使用します。