Dplyr チュートリアル: R でのデータのマージと結合と例
データ分析入門
データ分析は次の XNUMX つの部分に分けることができます。
- 抽出プロセス: まず、多くのソースからデータを収集し、それらを組み合わせる必要があります。
- 最適化の適用: このステップにはデータ操作が含まれます。 すべてのデータソースを統合したら、データのクリーンアップを開始できます。
- 視覚化する: 最後の手段は、データを可視化して異常をチェックすることです。

データ サイエンティストが直面する最も重要な課題の XNUMX つはデータ操作です。 データが希望の形式で利用できることはありません。 データ サイエンティストは、少なくとも半分の時間をデータのクリーニングと操作に費やす必要があります。 それは仕事の中で最も重要な任務の XNUMX つです。 データ操作プロセスが完全で正確かつ厳密でない場合、モデルは正しく動作しません。
R ディプライア
R には、データ変換に役立つ dplyr というライブラリがあります。 dplyr ライブラリは基本的に、データを操作する XNUMX つの関数とデータをクリーンアップする XNUMX つの動詞を中心に作成されています。 その後、ggplot ライブラリを使用してデータを分析および視覚化できます。
dplyr ライブラリを使用して、 データフレーム.
R Dplyr を使用してデータをマージする
dplyr は、データセットを結合する優れた便利な方法を提供します。 入力データのソースが多数ある場合、ある時点でそれらを組み合わせる必要があります。 dplyr を使用した結合では、元のデータセットの右側に変数が追加されます。
Dplyr 結合
以下は、dplyr で 2 つのデータセットを結合するために使用される 4 つの重要な結合の種類です。
演算 | DevOps Tools Engineer試験のObjective | Arguments | 複数のキー |
---|---|---|---|
left_join() | XNUMX つのデータセットを結合します。 元のテーブルからのすべての観測値を保持します | データ、出発地、目的地、by = 「ID」 | 出発地、目的地、by = c(“ID”, “ID2”) |
right_join() | XNUMX つのデータセットを結合します。 宛先テーブルからのすべての観測値を保持します | データ、出発地、目的地、by = 「ID」 | 出発地、目的地、by = c(“ID”, “ID2”) |
inner_join() | XNUMX つのデータセットを結合します。 一致しない行をすべて除外します | データ、出発地、目的地、by = 「ID」 | 出発地、目的地、by = c(“ID”, “ID2”) |
full_join() | XNUMX つのデータセットを結合します。 すべての観察を保持します | データ、出発地、目的地、by = 「ID」 | 出発地、目的地、by = c(“ID”, “ID2”) |
簡単な例を使用して、すべての結合タイプを学習します。
まず、1 つのデータセットを構築します。 表 2 には XNUMX つの変数 ID と y が含まれており、表 XNUMX には ID と z がまとめられています。 それぞれの状況において、 キーペア 変数。 私たちの場合、ID は私たちのものです キー 変数。 この関数は両方のテーブルで同一の値を検索し、返された値をテーブル 1 の右側にバインドします。
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
Dplyr left_join()
1 つのデータセットをマージする最も一般的な方法は、left_join() 関数を使用することです。 下の図から、キー ペアが両方のデータセットの行 A、B、C、D に完全に一致していることがわかります。 ただし、EとFは余ってしまいます。 これら XNUMX つの観察をどのように処理すればよいでしょうか? left_join() を使用すると、すべての変数を元のテーブルに保持し、宛先テーブルでキーペアになっていない変数は考慮しません。 この例では、変数 E はテーブル XNUMX に存在しません。したがって、行は削除されます。 変数 F は元のテーブルから取得されます。 これは left_join() の後に保持され、列 z で NA を返します。 以下の図は、left_join() で何が起こるかを再現しています。
dplyr left_join() の例
left_join(df_primary, df_secondary, by ='ID')
出力:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
Dplyr right_join()
right_join() 関数は left_join() とまったく同じように機能します。 唯一の違いは、削除された行です。 宛先データ フレームで使用可能な値 E は新しいテーブルに存在し、列 y の値 NA をとります。
dplyr right_join() の例
right_join(df_primary, df_secondary, by = 'ID')
出力:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
Dplyr inner_join()
100 つのデータセットが一致しないと XNUMX% 確信できる場合は、次の結果を返すことを検討できます。 の に存在する行 両言語で データセット。 これは、クリーンなデータセットが必要な場合、または欠損値を平均や中央値で代入したくない場合に可能です。
inner_join() が役に立ちます。 この関数は、一致しない行を除外します。
dplyr inner_join() の例
inner_join(df_primary, df_secondary, by ='ID')
出力:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
Dplyr full_join()
最後に、full_join() 関数はすべての観測値を保持し、欠損値を NA に置き換えます。
dplyr full_join() の例
full_join(df_primary, df_secondary, by = 'ID')
出力:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
複数のキーペア
最後に、データセットには複数のキーを含めることができます。顧客が購入した年や製品のリストが含まれる次のデータセットを検討してください。
両方のテーブルをマージしようとすると、Rはエラーをスローします。この状況を改善するには、1つのキーペア変数を渡すことができます。つまり、両方のデータセットに表示されるIDと年です。次のコードを使用して、テーブル2とテーブルXNUMXをマージできます。
df_primary <- tribble( ~ID, ~year, ~items, "A", 2015,3, "A", 2016,7, "A", 2017,6, "B", 2015,4, "B", 2016,8, "B", 2017,7, "C", 2015,4, "C", 2016,6, "C", 2017,6) df_secondary <- tribble( ~ID, ~year, ~prices, "A", 2015,9, "A", 2016,8, "A", 2017,12, "B", 2015,13, "B", 2016,14, "B", 2017,6, "C", 2015,15, "C", 2016,15, "C", 2017,13) left_join(df_primary, df_secondary, by = c('ID', 'year'))
出力:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
R のデータ クリーニング関数
データを整理 (クリーンアップ) するための重要な 4 つの機能は次のとおりです。
演算 | DevOps Tools Engineer試験のObjective | Arguments |
---|---|---|
集める() | データをワイドからロングに変換する | (データ、キー、値、na.rm = FALSE) |
広める() | データを長いデータから広いデータに変換する | (データ、キー、値) |
別() | XNUMX つの変数を XNUMX つに分割する | (data、col、into、sep= “”、remove = TRUE) |
ユニット() | XNUMX つの変数を XNUMX つにまとめる | (data、col、conc、sep= ""、remove = TRUE) |
Tidyr ライブラリを使用します。 このライブラリは、データを操作、クリーンアップ、視覚化するためのライブラリのコレクションに属しています。 anaconda を使用して R をインストールすると、ライブラリはすでにインストールされています。 ここでライブラリを見つけることができます。 https://anaconda.org/r/r-tidyr.
まだインストールされていない場合は、次のコマンドを入力して tidyr をインストールします。
install tidyr : install.packages("tidyr")
集める()
Gather() 関数の目的は、データをワイドデータからロングデータに変換することです。
構文
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
例
以下に、ワイドからロングへの再形成の概念を視覚化できます。 四半期変数の行を埋め込む、growth という名前の XNUMX つの列を作成したいと考えています。
library(tidyr) # Create a messy dataset messy <- data.frame( country = c("A", "B", "C"), q1_2017 = c(0.03, 0.05, 0.01), q2_2017 = c(0.05, 0.07, 0.02), q3_2017 = c(0.04, 0.05, 0.01), q4_2017 = c(0.03, 0.02, 0.04)) messy
出力:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data tidier <-messy %>% gather(quarter, growth, q1_2017:q4_2017) tidier
出力:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
元のデータセットには XNUMX つのグループ変数 (つまり、国とキーと値のペア) があるため、gather() 関数では、四半期と成長という XNUMX つの新しい変数を作成します。
広める()
Spread() 関数は、Gather の逆のことを行います。
構文
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
例
Spread() を使用すると、整然としたデータセットを乱雑なデータセットに戻すことができます。
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
出力:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
別()
Separate() 関数は、セパレータに従って列を XNUMX つに分割します。 この関数は、変数が日付である場合に役立ちます。 分析では月と年に焦点を当てる必要があるため、列を XNUMX つの新しい変数に分割したいと考えています。
構文
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
例
Separate() 関数を適用すると、より整理されたデータセット内の年から四半期を分割できます。
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
出力:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
団結()
Unite() 関数は XNUMX つの列を XNUMX つに連結します。
構文
unit(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
例
上記の例では、四半期と年を分離しました。これらを結合したい場合はどうすればよいでしょうか。次のコードを使用します。
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
出力:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
まとめ
- データ分析 抽出、変換、視覚化の XNUMX つの部分に分けることができます。
- R には、データ変換に役立つ dplyr というライブラリがあります。 dplyr ライブラリは基本的に、データを操作する XNUMX つの関数とデータをクリーンアップする XNUMX つの動詞を中心に作成されています。
- dplyr は、データセットを結合する優れた便利な方法を提供します。 dplyr を使用した結合では、元のデータセットの右側に変数が追加されます。
- dplyr の利点は、次のような XNUMX 種類の結合を処理できることです。 SQL:
- left_join() – XNUMX つのデータセットをマージし、元のテーブルからのすべての観測値を保持します。
- right_join() – XNUMX つのデータセットをマージし、宛先テーブルからのすべての観測値を保持します。
- inner_join() – XNUMX つのデータセットをマージし、一致しない行をすべて除外します。
- full_join() – XNUMX つのデータセットを結合し、すべての観測値を保持します。
- tidyr ライブラリを使用すると、次の関数を使用してデータセットを変換できます。
- 集める(): データをワイドからロングに変換します。
- 広める(): データをロングからワイドに変換します。
- 別(): XNUMX つの変数を XNUMX つに分割します。
- ユニット(): XNUMX つの変数を XNUMX つにまとめます。