R Select()、Filter()、Arrange()、パイプラインと例

⚡ スマートサマリー

R言語におけるselect、filter、arrangeは、データフレームを必要な列、行、順序に絞り込むための3つのdplyrコマンドです。このチュートリアルでは、205行の移動時間データセットに対して、これらのコマンドをパイプ演算子で連結する方法を説明します。

  • ???? 列の選択: select(df, A, B) は名前付き列を保持し、select(df, A:C) は範囲を保持し、select(df, -C) は 1 つの列を削除します。
  • 🔎 行フィルタリング: filter(df, condition) は一致する行を保持し、条件は AND の場合はアンパサンド、OR の場合は縦棒と組み合わせて使用​​します。
  • 🔣 並べ替え: arrange() 関数はデフォルトで行を昇順に並べ替え、desc() 関数は任意の列を降順に並べ替えます。
  • 🔗 Pipe Operaトール: %>% 演算子は各結果を次の動詞に直接渡すため、中間オブジェクトが環境を煩雑にすることはありません。
  • 🧹 ヘルパー関数: starts_with()、contains()、where() 関数は、列を名前ではなくパターンまたは型で選択します。
  • 📐 動詞の語順は重要です。 早い段階でデータをフィルタリングして量を減らし、次に選択し、最後に整理することで、後続のすべてのステップのコストを削減できます。

R フィルターを選択 パイプラインを配置

Rにおけるdplyrとは何ですか?

dplyr は、tidyverse のデータ操作パッケージです。これは、base の括弧表記を置き換えます。 R 少数の動詞で構成され、それぞれの動詞は実行する動作にちなんで名付けられ、最初の引数としてデータフレームを受け取ります。この一貫した構造によって、動詞を連結することが可能になります。

動詞 作用する 何それがありません
選択する() コラム 変数を保持するか削除するか
フィルタ() 条件に一致する行を保持する
整える() 行を1つ以上の列で並べ替えます
mutate() コラム 変数を作成または変更します
要約する() テーブル全体 複数の行を1つの統計情報に集約します
group_by() テーブル全体 データを分割し、後続の動詞がグループごとに実行されるようにします。

このチュートリアルでは、最初の3つの動詞とパイプについて解説します。 集計関数チュートリアル group_by()とsummarise()について詳しく解説します。

このチュートリアルで使用されるデータセット

dplyrというライブラリには、データセット内をナビゲートするための便利な動詞が含まれています。このチュートリアルでは、Travel timesデータセットを使用します。このデータセットは、ドライバーが自宅と職場の間を移動する際の記録です。データセットには、以下の14個の変数があります。

  • DayOfWeek: ドライバーが車を使用する曜日を特定します。
  • 距離: 移動の合計距離
  • MaxSpeed: 移動の最高速度
  • TotalTime: 移動の長さ (分単位)

このデータセットには205件の観測データが含まれており、乗車は Monday 金曜日まで。

まず最初に、次のことを行う必要があります。

  • データセットをロードする
  • データの構造を確認してください。

dplyrの便利な関数の一つにglimpse()があります。これはRの基本関数str()と同じ役割を果たしますが、変数ごとに1行ずつ、型と最初の数個の値を出力するため、大規模なデータセットでも簡単にスキャンできます。

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

出力:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

コメント変数については、明らかに詳細な調査が必要です。最初の観測値はすべて空欄です。

sum(df$Comments =="")

Code 説明

  • sum(df$Comments == “”): dfのComments列で空文字列と等しい観測値をカウントします。

出力:

## [1] 181

データが読み込まれたら、列をトリミングする動詞から始めます。

選択する()

select() 動詞から始めます。 必ずしもすべての変数が必要なわけではありません。関連性があると思われる変数のみを選択することをお勧めします。

欠落している観測値は 181 個あり、これはデータセットのほぼ 90% です。 それらを除外すると、分析を続行できなくなります。

もう XNUMX つの方法は、select() 動詞を使用して変数 Comment を削除することです。

select() を使用すると、さまざまな方法で変数を選択できます。 最初の引数はデータセットであることに注意してください。

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

XNUMX 番目の方法を使用して、Comments 変数を除外できます。

step_1_df <- select(df, -Comments)
dim(df)

出力:

## [1] 205  14
dim(step_1_df)

出力:

## [1] 205  13

元のデータセットには 14 個の特徴がありますが、step_1_df には 13 個の特徴があります。

Rにおけるselect()ヘルパー関数

データセットに数十個の変数が含まれるようになると、すべての列に名前を付けるのは非現実的になります。dplyrには、パターンまたは型に基づいて列を選択するヘルパー関数が付属しています。

ヘルパー 列を選択します 例:
starts_with() 文字列から始めます select(df, starts_with(“Avg”))
ends_with() 文字列で終了 select(df, ends_with(“Time”))
を含む() 文字列をどこかに含む select(df, contains(“Speed”))
マッチ() 正規表現に一致する select(df, matches(“^Max|^Avg”))
どこ() 型テストを満たす select(df, where(is.numeric))
すべて() まだ名前が付けられていません select(df, TotalTime, everything())
# Keep only the timing columns
df %>% select(ends_with("Time"))

# Keep every numeric column
df %>% select(where(is.numeric))

# Move TotalTime to the front, keep the rest in place
df %>% select(TotalTime, everything())

select() と自然に組み合わせられる動詞がさらに 2 つあります。rename(new_name = old_name) を使用すると、列を削除せずにラベルを変更できます。ping その他については、relocate() を使用して、すべての列をリストアップせずに移動します。

フィルタ()

filter() 動詞は、条件を満たす観測値のみを保持します。filter() は select() とまったく同じように機能し、最初にデータフレームを渡し、次にカンマで区切られた条件を渡します。

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

一つの基準

まず、因子変数の各レベル内の観測値の数を数えることができます。

table(step_1_df$GoingTo)

Code 説明

  • table(): レベルごとの観測数をカウントします。因子型または文字型の変数を引数として受け取ります。
  • table(step_1_df$GoingTo): 各目的地への移動回数をカウントします

出力:

## 
##  GSK Home 
##  105  100	

関数 table() は、105 の乗り物が GSK に行き、100 がホームに行くことを示します。

データをフィルタリングして、105 個の観測値を含む 100 つのデータセットと XNUMX 個の観測値を含む別のデータセットを返すことができます。

# Select observations where GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

出力:

## [1] 100  14
# Select observations where GoingTo == GSK (work)
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

出力:

## [1] 105  14

複数の基準

データセットを複数の条件でフィルタリングできます。たとえば、trac目的地が自宅であり、旅行が水曜日に行われた観測結果。

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

出力:

## [1] 23 14

23 件の観察がこの基準に一致しました。

一般的なフィルター()条件と OperaRのトルズ

filter() 関数は、条件が TRUE と評価されるすべての行を保持します。NA と評価される行は削除されます。この動作は、多くの初心者にとって意外なものです。

Operator 意味 例:
== に等しい filter(df, GoingTo == “Home”)
!= 等しくない filter(df, DayOfWeek != “Monday")
& そして、両方とも filter(df, Distance > 50 & MaxSpeed > 130)
| または、どちらも filter(df, DayOfWeek == “Monday” | DayOfWeek == “Friday”)
%で% ベクトル内の任意の値に一致します filter(df, DayOfWeek %in% c(“Monday"、 "金曜日"))
の間に() 数値範囲内に収まる filter(df, between(Distance, 48, 52))
は.な() 欠損値ですか filter(df, is.na(FuelEconomy))

3つの習慣で、filter() 関数のバグのほとんどを防ぐことができます。

  • 連鎖ORの代わりに%in%を使用してください。 filter(df, DayOfWeek %in% c(“Monday」は、縦棒で結ばれた 2 つの == 比較よりも短く、入力ミスもはるかに起こりにくいです。
  • 欠損値を == で検定してはいけません。 式 x == NA は TRUE ではなく NA を返すため、行は警告なしに削除されます。代わりに is.na(x) を使用してください。
  • コンマはANDを意味します。 filter(df, a, b) は filter(df, a & b) と同一であるため、このチュートリアルの前の例ではどちらの方法でも動作します。

パイプ Operadplyr の tor

データセットの作成には、次のような多くの操作が必要です。

  • インポート
  • マージ
  • 選択
  • フィルタリング
  • 等々

dplyrライブラリには、%>%と呼ばれる実用的な演算子が付属しています。 パイプこれにより、データ操作がよりクリーンになり、より速く、エラーが発生しにくくなります。

この演算子は、中間ステップをハード ドライブに保存せずにステップを実行するコードです。上記の例に戻ると、関心のある変数を選択してフィルターすることができます。3 つのステップがあります。

  • ステップ 1: データのインポート: GPS データをインポートします。
  • ステップ 2: データの選択: GoingTo と DayOfWeek を選択します
  • ステップ 3: データのフィルター: 家と水曜日のみを返す

これを行うには難しい方法を使用できます。

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

出力:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

これは、多数の操作を連鎖させるのに便利な方法ではありません。すべての中間結果が環境内に残ってしまうため、名前の意味がすぐに失われてしまいます。

代わりにパイプ演算子 %>% を使用してください。データフレームの名前は最初に一度指定すれば、以降のすべてのステップはその名前に基づいて実行されます。

パイプラインの基本構文

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: the last instruction does not need a trailing `%>%`, because nothing follows it
- Note: assigning the result to a new object is optional. Without it, the output prints in the console.

上記の手順に従って、最初のパイプを作成できます。

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) %>% 

#Step 2
select(GoingTo, DayOfWeek) %>% 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

出力:

## [1] TRUE

2つのオブジェクトは同一であるため、パイプ処理によって全く同じ結果が単一の読みやすい文で生成された。

整える()

前のチュートリアルでは、関数 sort() を使用して値を並べ替える方法を学びます。 ライブラリ dplyr にはソート機能があります。 パイプラインでは魅力的に機能します。 assign() 動詞は、XNUMX つまたは複数の行を昇順 (デフォルト) または降順に並べ替えることができます。

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

目的地ごとに距離を並べ替えることができます。

# Sort by destination and distance
step_2_df <- step_1_df %>%
    arrange(GoingTo, Distance)
head(step_2_df)

出力:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

dplyr R の動詞: クイックリファレンス

以下の表は、このチュートリアルで使用されているすべての動詞とその構文、および各呼び出しが返す値を一覧にしたものです。

動詞 DevOps Tools Engineer試験のObjective Code 説明
垣間見る DF の構造をチェックする
glimpse(df)
str() と同じ目的で、読みやすい。
選択する() 変数の選択/除外
select(df, A, B ,C)
変数 A、B、C を選択します
select(df, A:C)
A から C までのすべての変数を選択します
select(df, -C)
Cを除く
フィルタ() 1つ以上の条件に一致する行を保持します
filter(df, condition1)
XNUMXつの条件
filter(df, condition1 & condition2)
2つの条件をANDで組み合わせる
整える() XNUMX つまたは複数の変数を使用してデータセットを並べ替える
arrange(A)
変数 A の昇順ソート
arrange(A, B)
変数 A と B の昇順ソート
arrange(desc(A), B)
変数 A の降順ソートと変数 B の昇順ソート
%>% 各ステップ間にパイプラインを作成する
step 1 %>% step 2 %>% step 3

よくあるご質問

dplyr に同梱されている magrittr の %>% パイプは、ドットを使ったプレースホルダー構文をサポートしています。ネイティブの |> パイプは R 4.1 で導入され、パッケージは不要です。どちらも左側の結果を右側の最初の引数に渡します。

いいえ。dplyrの各動詞は新しいデータフレームを返し、入力は変更されません。変更を永続化するには、結果をオブジェクトに代入するか、パイプで次の処理に渡す必要があります。

NAとの比較ではTRUEではなくNAが返され、filter()はTRUEの行のみを残します。意図的に欠損値を選択するにはis.na()を使用するか、tidyrのdrop_na()を使用して欠損値を削除してください。

AIモデルの特徴量エンジニアリングは、主に行のフィルタリング、列の選択、ソートから成ります。dplyrはこれらの手順を、レビュー担当者が監査できる読みやすいパイプラインとして表現します。これは、トレーニングデータセットの再現性が求められる場合に重要です。

はい。AIアシスタントは、括弧内の部分抽出をselect()とfilter()の呼び出しに変換し、パイプの説明を行うことができます。基本Rとdplyrでは欠損値の扱いが異なるため、必ず両方のバージョンを実行して次元を比較してください。