web-dev-qa-db-ja.com

サブセット関数と論理演算子で複数の基準を使用する

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)))

しかし、論理演算子を使用してデータを選択できるようにしたいので、なぜ最初のアプローチが機能しなかったのですか?

19
JanD

正しい演算子は、ここでは_%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
_
27
Gavin Simpson

あなたの例として、私は以下がうまくいくと信じています:

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も指摘しているように、|||の違いを必ず理解してください。演算子のヘルプページを表示するには、演算子を引用符で囲んだ?'||'を使用します。

5
jthetzel