R Select()、Filter()、Arrange()、パイプラインと例
⚡ スマートサマリー
R言語におけるselect、filter、arrangeは、データフレームを必要な列、行、順序に絞り込むための3つのdplyrコマンドです。このチュートリアルでは、205行の移動時間データセットに対して、これらのコマンドをパイプ演算子で連結する方法を説明します。
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 |

