Dplyr チュートリアル: R でのデータのマージと結合と例

データ分析入門

データ分析は次の XNUMX つの部分に分けることができます。

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

データ サイエンティストが直面する最も重要な課題の XNUMX つはデータ操作です。 データが希望の形式で利用できることはありません。 データ サイエンティストは、少なくとも半分の時間をデータのクリーニングと操作に費やす必要があります。 それは仕事の中で最も重要な任務の XNUMX つです。 データ操作プロセスが完全で正確かつ厳密でない場合、モデルは正しく動作しません。

R ディプライア

R には、データ変換に役立つ dplyr というライブラリがあります。 dplyr ライブラリは基本的に、データを操作する XNUMX つの関数とデータをクリーンアップする XNUMX つの動詞を中心に作成されています。 その後、ggplot ライブラリを使用してデータを分析および視覚化できます。

dplyr ライブラリを使用して、 データフレーム.

R Dplyr を使用してデータをマージする

dplyr は、データセットを結合する優れた便利な方法を提供します。 入力データのソースが多数ある場合、ある時点でそれらを組み合わせる必要があります。 dplyr を使用した結合では、元のデータセットの右側に変数が追加されます。

Dplyr 結合

Following dplyr で XNUMX つのデータセットをマージするために使用される XNUMX つの重要なタイプの結合です。

演算 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 の右側にバインドします。

R Dplyr を使用してデータをマージする

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() の例

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() の例

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() の例

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() の例

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

複数のキーペア

最後に重要なことですが、データセットには複数のキーを含めることができます。 以下を検討してくださいwing 顧客が購入した年数または製品のリストが含まれるデータセット。

R 内の複数のキー ペア

両方のテーブルをマージしようとすると、R はエラーをスローします。 この状況を解決するには、XNUMX つのキーペアの変数を渡します。 つまり、両方のデータセットに表示される ID と年です。 以下を使用できますwing table1とtable2をマージするコード

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 のデータ クリーニング関数

Following データを整頓 (クリーン) するための XNUMX つの重要な機能です。

演算 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.

まだインストールされていない場合は、次のように入力しますwing tinyr をインストールするコマンド:

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 つの列を作成したいと考えています。

R の Gather() 関数の例

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

上の例では、四半期と年を分けています。 それらをマージしたい場合はどうすればよいでしょうか。 私たちは以下を使用しますwing コー​​ド:

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 ライブラリを使用すると、次のようにデータセットを変換できます。wing 機能:
    • 集める(): データをワイドからロングに変換します。
    • 広める(): データをロングからワイドに変換します。
    • 別(): XNUMX つの変数を XNUMX つに分割します。
    • ユニット(): XNUMX つの変数を XNUMX つにまとめます。