R で複数の条件を使用してデータ フレームをフィルター処理する
![R で複数の条件を使用してデータ フレームをフィルター処理する](/img/R/feature-image---r-filter-multiple-conditions,-dplyr-filter-multiple-conditions.webp)
データ フレームの行のフィルタリングは、データ分析の一般的な手順です。 多くの場合、結果の行を複数の条件を満たす行に制限する必要があります。
このような複数の条件が関係している場合、望ましい結果を得るには、いくつかの情報に関する知識を組み合わせる必要があります。 これらは次のものに関係します。
- ブール演算子の使用。
- 式の評価における優先順位。
- 括弧を使用して、評価の順序を指定します。
R で複数の条件を使用してデータ フレームをフィルター処理する
まず、この記事のサンプル データ フレームを作成します。 また、デモンストレーションで filter()
関数を使用するために dplyr
パッケージをロードします。
コード例:
# Create a data frame for the article.
SN = 1:7
Alph = c("M", "M", "N", "N", "K", "K", "M")
Nmbr = c(11, 22, 11, 22, 11, 22, 0)
tb = data.frame(SN, Alph, Nmbr)
tb
# Load the dplyr package.
library(dplyr)
出力:
> tb
SN Alph Nmbr
1 1 M 11
2 2 M 22
3 3 N 11
4 4 N 22
5 5 K 11
6 6 K 22
7 7 M 0
ブール演算子の使用
ブール演算子を使用して、複数の条件を結合します。
AND
演算子&
は、両側の両方の条件がTRUE
と評価された場合にのみTRUE
を返します。OR
演算子|
は、一方または両方の条件のいずれかがTRUE
と評価された場合にTRUE
を返します。NOT
演算子!
は、FALSE
条件をTRUE
に、またはその逆に変換します。
関係演算子を使用して条件を指定します。 等しいかどうかを比較するには、演算子は ==
です。
コード例:
# Filter rows where Alph is "M" OR "N".
tb %>% filter(Alph=="M" | Alph == "N")
# Filter rows where Alph is "M" AND Nmbr == 22.
tb %>% filter(Alph=="M" & Nmbr == 22)
# Filter rows where Alph is NOT "M".
tb %>% filter(!Alph=="M")
出力:
> # Filter rows where Alph is "M" OR "N".
> tb %>% filter(Alph=="M" | Alph == "N")
SN Alph Nmbr
1 1 M 11
2 2 M 22
3 3 N 11
4 4 N 22
5 7 M 0
> # Filter rows where Alph is "M" AND Nmbr == 22.
> tb %>% filter(Alph=="M" & Nmbr == 22)
SN Alph Nmbr
1 2 M 22
> # Filter rows where Alph is NOT "M".
> tb %>% filter(!Alph=="M")
SN Alph Nmbr
1 3 N 11
2 4 N 22
3 5 K 11
4 6 K 22
- 最初の例では、
Alph
がM
またはN
である行をフィルタリング (選択) しました。OR
演算子の両側で完全な条件を指定する必要があることに注意してください。 - 2 番目の例では、
Alph
がM
であり、Nmbr
が22
である行を同時にフィルタリングしました。 - 3 番目の例では、列
Alph
がM
ではない行をフィルタリングしました。
式の評価における優先順位
複数の条件を組み合わせるコンテキストでは、次の演算子の優先順位に注意する必要があります。
NOT
演算子、!
。AND
演算子、&
。OR
演算子、|
。- オペランドは、括弧で上書きされない限り、上記に従って、左から右にグループ化されます。
コード例:
# The ! operator only applies to the Alph column.
tb %>% filter(!Alph=="M" & Nmbr==11)
# The & operator only combines its two neighbors.
tb %>% filter(Alph=="M" & Nmbr==11 | Nmbr==22)
# The | operator gets applied AFTER &.
tb %>% filter(Nmbr==11 | Nmbr==22 & Alph=="M")
出力:
> # The ! operator only applies to the Alph column.
> tb %>% filter(!Alph=="M" & Nmbr==11)
SN Alph Nmbr
1 3 N 11
2 5 K 11
> # The & operator only combines its two neighbors.
> tb %>% filter(Alph=="M" & Nmbr==11 | Nmbr==22)
SN Alph Nmbr
1 1 M 11
2 2 M 22
3 4 N 22
4 6 K 22
> # The | operator gets applied AFTER &.
> tb %>% filter(Nmbr==11 | Nmbr==22 & Alph=="M")
SN Alph Nmbr
1 1 M 11
2 2 M 22
3 3 N 11
4 5 K 11
優先順位により、次のことがわかりました。
!
&
演算子が最初の例の条件を結合する前に、演算子がAlph
に適用されました。&
演算子は、|
の左側に結果を渡す前に、両側の 2つの条件を結合します。 オペレーター。- 3 番目の例では、
&
が最初に適用されました。|
の右側には、最初に&
をその 2つのオペランドに適用した結果があります。
括弧を使用して目的の組み合わせを指定する
括弧を使用して複数の条件をグループ化し、目的の結果を得ることができます。 括弧を使用して、操作の順序 (優先順位) を制御できます。
前のセクションと同じ例を使用しますが、異なる結果が得られるように括弧を使用して変更します。
コード例:
# The ! operator now applies to the result of the & operation.
tb %>% filter(!(Alph=="M" & Nmbr==11))
# The & operator now has the result of the | operator on its right.
tb %>% filter(Alph=="M" & (Nmbr==11 | Nmbr==22))
# Now, the | operator gets applied first, and the result is passed to &.
tb %>% filter((Nmbr==11 | Nmbr==22) & Alph=="M")
出力:
> # The ! operator now applies to the result of the & operation.
> tb %>% filter(!(Alph=="M" & Nmbr==11))
SN Alph Nmbr
1 2 M 22
2 3 N 11
3 4 N 22
4 5 K 11
5 6 K 22
6 7 M 0
> # The & operator now has the result of the | operator on its right.
> tb %>% filter(Alph=="M" & (Nmbr==11 | Nmbr==22))
SN Alph Nmbr
1 1 M 11
2 2 M 22
> # Now, the | operator gets applied first, and the result is passed to &.
> tb %>% filter((Nmbr==11 | Nmbr==22) & Alph=="M")
SN Alph Nmbr
1 1 M 11
2 2 M 22
括弧があるため、異なる結果が得られます。
-
最初の例では、
!
&
演算子が条件を結合した後に、演算子が適用されるようになりました。 -
2 番目の例では、
|
操作が最初に実行されます。 結果は、&
の右側のオペランドとして渡されます。 -
3 番目の例でも、
|
が最初に実行されます。 前の例と同じ結果が得られることに注意してください。これを、前のセクションのこれらのさまざまな結果と比較してください。
%in%
演算子を使用する
R の %in%
演算子を使用して、列の値が渡されたベクトルに記載されている値のいずれかである行をフィルター処理できます。 これは、OR
演算子を使用して同じ列で複数の条件を組み合わせることと同じです。
コード例:
# Filter rows where Alph is M or K.
tb %>% filter(Alph %in% c("M", "K"))
出力:
> # Filter rows where Alph is M or K.
> tb %>% filter(Alph %in% c("M", "K"))
SN Alph Nmbr
1 1 M 11
2 2 M 22
3 5 K 11
4 6 K 22
5 7 M 0
参照
式の評価における優先順位の詳細については、R 言語定義の セクション 10.4.2 中置演算子と前置演算子 を参照してください。