25

R でデータのサブセットを選択する場合は、subset 関数を使用できます。特定の変数が 1、2、または 3 のいずれかであるなど、いくつかの基準のいずれかに一致するデータに基づいて分析したかったのです。

myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))

ここでは、最初の基準に一致する値を常に選択するだけでした。ここでは 1 です。私の仮定では、1 から始まり、「false」と評価された場合は 2 に進み、一致するものがなければ 3 に進みます。 == の後のステートメントは「偽」であり、それらのいずれかが一致する場合、それは「真」です。

を使用して正しい結果を得ました

 newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))

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

4

2 に答える 2

35

正しいオペレーターは%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

集合のいずれかに等しいdatwhereのサブセットは、を使用して次のように取得されます。bf111,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()呼び出しbf11TRUE(または に評価されたものTRUE) の行のみを返します。

あなたが書くことができたのは、次のようなものでした:

subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

以前のsubset()呼び出しと同じ結果が得られます。ポイントは、一連のオプションの比較ではなく、一連の単一の比較が必要だということです。しかし、ご覧の%in%とおり、このような状況では、はるかに便利で冗長性が低くなります。、、およびの各要素を順番|に比較したいので、を使用する必要があることにも注意してください。比較:bf11123

> 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
于 2011-04-26T18:18:50.337 に答える
10

あなたの例では、次のように動作するはずです。

myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

詳細については、 の例を参照してください?subset。例証として、より複雑な論理サブセットは次のようになります。

data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)

Chaseが指摘しているよう%in%に、あなたの例ではより効率的です:

myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))

Chase も指摘しているように、 と の違いを理解していることを確認して|ください||。演算子のヘルプ ページを表示する?'||'には、演算子を引用符で囲んだ を使用します。

于 2011-04-26T18:17:58.153 に答える