web-dev-qa-db-ja.com

R gotcha:論理-条件を組み合わせるための演算子は&ではなく&&

subset()が2つの条件を組み合わせた論理演算子と&&演算子で機能しないのはなぜですか?

> subset(tt, (customer_id==177 && visit_date=="2010-08-26"))
<0 rows> (or 0-length row.names)

しかし、それらはそれぞれ個別に機能します。

> subset(tt, customer_id==177)

> subset(tt, visit_date=="2010-08-26")

(大きな一時変数の使用を避けたい-私のデータセットは巨大です)

21
smci

Logical Operatorsからアクセスできる?"&&"のヘルプページから:

&と&&は論理積を示し、|と||は論理積を示します。短い形式は算術演算子とほぼ同じ方法で要素ごとの比較を実行します。長い形式は左から右に評価して各ベクトルの最初の要素のみを調べます。評価は、結果が決定されるまでのみ進行します。長い形式は、制御フローのプログラミングに適しており、通常、if句で推奨されます。

(Rバージョン2.13-0)

つまり、subsetを使用する場合は、単一の&を使用します。


違いの図を次に示します。

c(1,1,0,0) & c(1,0,1,0)
[1]  TRUE FALSE FALSE FALSE

c(1,1,0,0) && c(1,0,1,0)
[1] TRUE

これが他のプログラミングパラダイムと比較して風変わりに見える場合は、Rがベクトル化された形式の演算子を提供する必要があることに注意してください。

26
Andrie

Rでは、実際には&ではなく&&演算子でペアワイズAND演算を実行し、&&でビット単位のANDを実行します。同じルールがORにも適用されます。ビット単位のORではなく論理OR)を実行する場合は、|演算子が必要です。

8
James Thompson