R 言語でのデータの再整形 (長くて広いテーブルの変換)

学習ノートは学習専用です。

目次

1- きちんとしたデータとは何ですか?

2-幅の広いテーブルが長いテーブルになります 

例 1:

例 2:

例 3:

3- 長いテーブル可変幅テーブル

例 1:

例 2:

1- きちんとしたデータとは何ですか?

Hadley 氏によると、クリーン データには次のような特徴があります。

  1. 各変数は列を形成します。つまり、同じ属性を持つ変数が列を形成します。
  2. 各観測値は行を構成します。
  3. 各観測値の各変数値がセルを構成します。

上記の条件を満たさないデータはダーティ データやアンティデータと呼ばれ、多くの場合次のような特徴があります。

  1. 列名は変数名ではなく値です。
  2. 複数の変数を 1 つの列に入れます。
  3. 変数は行と列の両方に配置されます。
  4. 複数のタイプの観測単位が同じセル内にあります。つまり、各セルは値ではありません。
  5. 1 つの観察ユニットが複数のテーブルに配置されます。

データの再整形: Tidyverse シリーズのパッケージの関数は整然としたデータ フレーム上で動作するため、まず整頓されていないデータを整然としたデータに変換する必要があります。

データの再整形には、長さと幅のテーブル変換、列の分割/マージ、および正方形が含まれます。このうち、長さと幅のテーブルの変換には、pivot_longer() 関数と pivot_wider() 関数を使用します。

ダーティ データの例と説明:

この例では、男性と女性の両方が性別に属しているため、男性と女性は 1 つの変数として分類できます。データの整頓に関する最初の要件に違反すると、列は変数になります。

 この例では、年齢と体重の 2 つの変数がバックスラッシュで区切られているものの 1 つの列に配置されているため、人間には常識的に理解するのが簡単ですが、コンピューターには理解できず、単に 2 つの変数が表示されるだけです。列はもともと数値データであり、文字列として扱われます。これは、各観測値の各変数がセルを構成するという、データの整頓に関する 3 番目のルールに違反します。

 この例では、クリーンなデータの 3 つの要件がいずれも満たされていません。

データを整理するための鍵は、変数、観測値、値を区別する方法を学ぶことです。

2-幅の広いテーブルが長いテーブルになります 

広いテーブル: すべての変数を明確に細分化したデータ セットを指します。テーブルは比較的広いです。セルに配置されるべき値が、セルに配置されるべき列名 (男性、女性など) に配置されます。 . 列の内容は、ある 2 つの列の列名になっています。

ロング テーブル: データセット内のカテゴリ変数を含むデータを指します。

tinyr パッケージの pivot_longer() 関数を使用して幅の広いテーブルを長いテーブルに変換し、 pivot_wider() 関数を使用して長いテーブルを幅の広いテーブルに変換します。これは pivot_longer() 関数の逆変換です。

文法の紹介:

pivot_longer(データ、列、名前_to、値_to、値_ドロップ_na, ...)

  • data: 再形成するデータ フレーム。
  • Cols: 列選択構文で変形する列、つまり処理する列を選択します。
  • names_to: 列名を設定します。具体的には、処理対象の列の列名を保存するために、新しい列または複数の列 (特定の問題に応じて) を作成し、新しく作成された列に新しい列名を設定します。
  • value_to: 列名を設定します。具体的には、処理対象の列とその下のセルの値を格納し、この列に新しい列名を設定します。
  • value_drop_na: 変形列の欠損値を無視するかどうか (NA、使用不可)
  • 変形された列の列名に、目的の「コンテンツ」に加えて接頭辞、変数名 + 区切り文字、および正規表現グループのキャプチャ パターンが含まれている場合、パラメータ names_prefix、names_sep、および names_pattern を使用して目的の「コンテンツ」を抽出できます。ここでの「コンテンツ」とは、列名の目的の部分を指すことに注意してください。

例 1 :

ワイドテーブル可変長テーブル(整形対象の列の列名を1列に格納)

> df <- read.csv("配套数据/分省年度GDP.csv")
> df
      地区  X2019年  X2018年  X2017年
1   北京市 35371.28 33105.97 28014.94
2   天津市 14104.28 13362.92 18549.19
3   河北省 35104.52 32494.61 34016.32
4 黑龙江省 13612.68 12846.48 15902.68


> df %>%
+   pivot_longer(-地区, names_to = "年份", values_to="GDP")
# A tibble: 12 × 3
   地区     年份       GDP
   <chr>    <chr>    <dbl>
 1 北京市   X2019年 35371.
 2 北京市   X2018年 33106.
 3 北京市   X2017年 28015.
 4 天津市   X2019年 14104.
 5 天津市   X2018年 13363.
 6 天津市   X2017年 18549.
 7 河北省   X2019年 35105.
 8 河北省   X2018年 32495.
 9 河北省   X2017年 34016.
10 黑龙江省 X2019年 13613.
11 黑龙江省 X2018年 12846.
12 黑龙江省 X2017年 15903.

df は幅の広いテーブルです。region 列を除いて、残りの列はすべて、再形成する列です。pivot_longer() 関数では、ここではパイプライン操作が使用されているため、最初のパラメーターは処理するデータ フレームです。したがって、この関数の最初のパラメータは省略され、2 番目のパラメータは再形成される列です。ここでは、領域を除く残りのすべての列が再形成したいものであることを意味します。3 番目のパラメータ names_to= "年" は、元のデータの形状を変更したい列です。この列の列名は新しい列に保存されます。names_to を使用して新しい列に列名を付けます。この場合、新しい列に「年」という名前を付けます4 番目のパラメーターは、values_to="GDP" で、元のデータの形状を変更する列を示します。この列のセルに格納されている値は、新しい列に配置されます。この新しい列の列名を取得する必要があります。 、列の名前は「GDP」です。

この例からわかるように、列を再形成し、これらの再形成された列の列名を抽出し、それらを新しい列のセルに配置し、それらをサイクルで繰り返します。つまり、x2019、x2018、および x2017 はサイクル。

例 2 :

ワイドテーブル可変長テーブル(整形対象の列の列名を複数列に格納)

生データ: ワイドテーブル

 目標は次のような長いテーブルに変換されます

分析します:

このデータは、各家族の子どもの情報を収集するもので、たとえば家族 1 には、child1 と child2 という 2 人の子どもがおり、これらの子どもの生年月日と性別が収集されます。

元のデータでは、整形したい列は家族列を除くすべての列です。これらの列の列名はアンダースコアで区切られています。データを子列、生年月日、性別の 3 列にしたいのです。性別。このうち、dobとgenderの2列はそのままで何も操作せず、child1とchild2が新しい列となり、この列にchildという名前を付けます。

> load("配套数据/family.rda")
> knitr::kable(family, align="c")


| family | dob_child1 | dob_child2 | gender_child1 | gender_child2 |
|:------:|:----------:|:----------:|:-------------:|:-------------:|
|   1    | 1998-11-26 | 2000-01-29 |       1       |       2       |
|   2    | 1996-06-22 |     NA     |       2       |      NA       |
|   3    | 2002-07-11 | 2004-04-05 |       2       |       2       |
|   4    | 2004-10-10 | 2009-08-27 |       1       |       1       |
|   5    | 2000-12-05 | 2005-02-28 |       2       |       1       |
> 
> family %>%
+   pivot_longer(-family,
+                names_to = c(".value", "child"),
+                names_sep="_",
+                values_drop_na = TRUE)
# A tibble: 9 × 4
  family child  dob        gender
   <int> <chr>  <date>      <int>
1      1 child1 1998-11-26      1
2      1 child2 2000-01-29      2
3      2 child1 1996-06-22      2
4      3 child1 2002-07-11      2
5      3 child2 2004-04-05      2
6      4 child1 2004-10-10      1
7      4 child2 2009-08-27      1
8      5 child1 2000-12-05      2
9      5 child2 2005-02-28      1

コードの説明:

  • -family は、変形する列がファミリー列以外の列であることを示します。
  • .names_sep="_" は、再形成された列の列名がアンダースコアで区切られていることを示します。
  • names_to=c(".value", "child") は、長いテーブル内に新しく作成された列の列名を設定するために使用されます。具体的には、整形対象の列の列名をアンダースコアで2つに分け、1つ目は生年月日と性別、2つ目は子1と子2とします。
    • 最初の部分によって生成された列情報 (列名 + その下のセルの内容) は変更されません。
    • 「child」は新しく作成された列の列名で、再形成される列名の 2 番目の部分、つまり子 1 と子 2 の内容を格納するために使用されます。
    • value_drop_na=TRUE: 変形する列の欠損値 NA がデータの再整形で無視されることを示します。

例 3:

ワイドテーブル可変長テーブル(整形対象の列の列名を複数列に格納)

生データのワイドテーブル

 目標: 次の形式の長いテーブルに変換します。

> df <- read.csv("配套数据/参赛队信息.csv")
> df
  队员1姓名 队员1专业 队员2姓名 队员2专业 队员3姓名 队员3专业
1      张三      数学      李四      英语      王五    统计学
2      赵六    经济学      钱七      数学      孙八    计算机
> 
> df %>%
+   pivot_longer(everything(),
+                names_to=c("队员", ".value"),
+                names_pattern = "(.*\\d)(.*)")
# A tibble: 6 × 3
  队员  姓名  专业  
  <chr> <chr> <chr> 
1 队员1 张三  数学  
2 队员2 李四  英语  
3 队员3 王五  统计学
4 队员1 赵六  经济学
5 队员2 钱七  数学  
6 队员3 孙八  计算机

 文法説明:

  • everything(): すべての列が選択されていること、つまり、再形成される列がすべての列であることを示します。
  • names_pattern= "(.*\\d)(.*)" : このパラメータと正規表現をグループのキャプチャに使用します。\\d は数字 (0 ~ 9) の一致を意味し、* は改行を除く任意の文字、文字、数字を意味し、* は少なくとも 1 回一致します。
  • names_to=c("チームメンバー", ".value") は、新しく作成された列の列名を示します。新しく作成された列の列名は「チームメンバー」で、残りの列と情報は変更されません。具体的には、整形対象の列の列名を正規表現で2つに分割し、前半部分の内容をchild1、child2とします。ここでは、列名の前半部分に対して新しい列を作成し、新しい列の列名は child に設定され、2 番目の部分は列情報です (列名とセル部分は変更されません。たとえば、この例では、2 番目の部分に 2 つの列名があります。名前とメジャーです。これら 2 つ)列は変更されず、元の列その列の下のセルの内容が保持されます。)

3- 長いテーブル可変幅テーブル

長くて広いテーブルを実装するには、tidyr パッケージの pivot_wider() 関数を使用します。

pivot_wider(データ、id_cols、names_from、values_from、values_fill,...)

の:

  • data: 再形成されるデータ フレームを示します。
  • id_cols: 観測を一意に識別する列。デフォルトは、names_from および value_from で指定された列以外の列です。
  • names_from: 列名がどの変数列に由来するかを指定します。
  • value_from: 列値がどの変数列から取得されるかを指定します。
  • value_fill: テーブルを拡張した後にセルの値が正しい場合、どの値を設定して埋める必要があります。
  • 列名を修正するのに役立つパラメータ、names_prefix、names_sep、names_glue もあります。

例 1:

列名と列値は 1 つだけあり、 

列名: Type 列から

列の値: Heads 列から

Tidy Data では、列名を使用してこの列全体の情報にアクセスできます。

> load("配套数据/animals.rda")
> animals
# A tibble: 228 × 3
   Type    Year  Heads
   <chr>  <int>  <dbl>
 1 Sheep   2015 24943.
 2 Cattle  1972  2189.
 3 Camel   1985   559 
 4 Camel   1995   368.
 5 Camel   1997   355.
 6 Goat    1977  4411.
 7 Cattle  1979  2477.
 8 Cattle  2014  3414.
 9 Cattle  1996  3476.
10 Cattle  2017  4388.
# ℹ 218 more rows
# ℹ Use `print(n = ...)` to see more rows
> 
> animals %>%
+   pivot_wider(names_from=Type, values_from=Heads, values_fill = 0)
# A tibble: 48 × 6
    Year  Sheep Cattle Camel   Goat Horse
   <int>  <dbl>  <dbl> <dbl>  <dbl> <dbl>
 1  2015 24943.  3780.  368. 23593. 3295.
 2  1972 13716.  2189.  625.  4338. 2239.
 3  1985 13249.  2408.  559   4299. 1971 
 4  1995     0   3317.  368.  8521. 2684.
 5  1997 14166.  3613.  355. 10265. 2893.
 6  1977 13430.  2388.  609   4411. 2104.
 7  1979 14400.  2477.  614.  4715. 2079.
 8  2014 23215.  3414.  349. 22009.    0 
 9  1996 13561.  3476.  358.  9135. 2770.
10  2017 30110.  4388.  434. 27347. 3940.
# ℹ 38 more rows
# ℹ Use `print(n = ...)` to see more rows

動物の元のデータの最初の列 Type の値が繰り返されていることがわかります。この列のセルの内容、つまり動物の種類が新しい変数として使用されます。複数の種類がある場合は、いくつかの種類を作成しますcolumns と use names_from 新しく作成した列名が元データのどの列のものかを指定します ここで使用するデータ フレームの列名は、この列の情報 (列名 + セルの内容) にアクセスできることを示し、values_from が使用されます新しく作成した列のセルを指定します。コンテンツが元のデータのどの列に由来するかを指定します。

例 2:

複数の列名列または複数の値列のみがあります。次の例は、estimate と moe という 2 つの値列があることを示しています。

> us_rent_income#tidyr自带的数据集;
# A tibble: 104 × 5
   GEOID NAME       variable estimate   moe
   <chr> <chr>      <chr>       <dbl> <dbl>
 1 01    Alabama    income      24476   136
 2 01    Alabama    rent          747     3
 3 02    Alaska     income      32940   508
 4 02    Alaska     rent         1200    13
 5 04    Arizona    income      27517   148
 6 04    Arizona    rent          972     4
 7 05    Arkansas   income      23789   165
 8 05    Arkansas   rent          709     5
 9 06    California income      29454   109
10 06    California rent         1358     3
# ℹ 94 more rows
# ℹ Use `print(n = ...)` to see more rows
> us_rent_income%>%
+   pivot_wider(names_from=variable, values_from=c(estimate, moe))
# A tibble: 52 × 6
   GEOID NAME             estimate_income estimate_rent moe_income moe_rent
   <chr> <chr>                      <dbl>         <dbl>      <dbl>    <dbl>
 1 01    Alabama                    24476           747        136        3
 2 02    Alaska                     32940          1200        508       13
 3 04    Arizona                    27517           972        148        4
 4 05    Arkansas                   23789           709        165        5
 5 06    California                 29454          1358        109        3
 6 08    Colorado                   32401          1125        109        5
 7 09    Connecticut                35326          1123        195        5
 8 10    Delaware                   31560          1076        247       10
 9 11    District of Col…           43198          1424        681       17
10 12    Florida                    25952          1077         70        3
# ℹ 42 more rows
# ℹ Use `print(n = ...)` to see more rows

広くて長いテーブル:

幅の広いテーブルを長いテーブルに変更するプロセスでは、整形する列を複数の列に「統合」する必要があります。抽象的には、複数の列を以前よりも少ない列に「統合」することを意味します。長いテーブルに変換されます。ここでの統合は引用符で囲まれており、整形する列の情報が統合されることを意味します。この統合操作は、新しい列を作成し、一部の列を保持することで完了します。男性、女性などのカテゴリ変数、変数としての男性、自己完結型の 1 つの列、変数としての女性が独自の列を形成する、幅の広いテーブルを長いテーブルに変更するプロセスは、男性と女性を変数に分類し、それらに性別という名前を付けることです。新しい列を作成するとき、それは列に名前を付けるには「」が必要です。この列の名前は文字列「gender」である必要があります。この性別列のセルの内容は、男性と女性によって繰り返し循環されます。元のデータ列の名前は男性の列で、その下のセルの内容は次のとおりです。女性列と同じです。セルの内容はそれ自体で列を形成します。このセル値に対して新しい列を作成する必要がある場合は、列名を取得します。列名は通常、文字列で表されます。

長いテーブルを拡張する過程では、長いテーブルの変数(つまり列)以下の内容が繰り返されますが、このとき、繰り返された内容を抽出して、これらの値を新しい列名にする必要があります, したがって、names_from、つまり新しい列名が元のデータのどの列に由来するかを設定します。このとき、パラメータの後には文字列ではなく列名が続きます。新しい列名を取得したら、新しい列、その下のセルの内容を入力する必要があります。どのような値を入力すればよいでしょうか? 元の長いテーブル (特定の問題の具体的な分析) の特定の列の値を使用して埋めます。 したがって、元のデータの列名は、文字列ではなく引用符なしで、values_from の後に埋められます。

サンプル データ ソース:

R 言語プログラミング: Tidyverse に基づく - 非同期コミュニティ - 高品質の IT 知識の公開と共有に取り組んでいます (epubit.com)

参考:

『R言語プログラミング』(2023年2月発行、人民郵政通信社)

『実践するRデータサイエンス ツールと事例分析を詳しく解説』(2019年6月発行、機械産業出版局)

R言語データ可視化実践(マイクロビデオフルソリューション版)---入門から習得までのビッグデータプロフェッショナルチャート。(電子産業新聞社 2022年2月掲載)

おすすめ

転載: blog.csdn.net/u011375991/article/details/132025047