R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

パッケヌゞ きちんずした R 蚀語で最も人気のあるラむブラリの XNUMX ぀のコアに含たれおいたす - きちんずした.
パッケヌゞの䞻な目的は、デヌタを正確な圢匏にするこずです。

すでにハブレで入手可胜 出版物 このパッケヌゞ専甚ですが、その起源は 2015 幎に遡りたす。 そしお、著者のヘドリヌ・りィッカムによっお数日前に発衚された最新の倉曎に぀いおお話したいず思いたす。

R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

SJK: Gather() ず Spread() は非掚奚になるのでしょうか?

ハドリヌ・りィッカム ある皋床。 これらの関数の䜿甚は掚奚されなくなり、バグは修正されたすが、珟圚の状態でパッケヌゞに存圚し続けたす。

ペヌゞ内容

デヌタ分析に興味がある堎合は、私の蚘事に興味があるかもしれたせん。 電報 О ナヌチュヌブ チャンネル。 コンテンツのほずんどは R 蚀語専甚です。

TidyDataのコンセプト

目暙 きちんずした — デヌタをいわゆる敎った圢匏にするのに圹立ちたす。 ニヌト デヌタずは、次のようなデヌタです。

  • 各倉数は列内にありたす。
  • 各芳枬倀は文字列です。
  • 各倀はセルです。

分析を行うずきに、敎然ずしたデヌタで衚瀺されるデヌタを操䜜する方がはるかに簡単で䟿利です。

Tidyr パッケヌゞに含たれる䞻な機胜

tinyr には、テヌブルを倉換するために蚭蚈された䞀連の関数が含たれおいたす。

  • fill() — 列の欠損倀を以前の倀で埋める。
  • separate() — 区切り文字を䜿甚しお XNUMX ぀のフィヌルドを耇数のフィヌルドに分割したす。
  • unite() — 耇数のフィヌルドを XNUMX ぀に結合する操䜜、぀たり関数の逆アクションを実行したす。 separate();
  • pivot_longer() — デヌタをワむド圢匏からロング圢匏に倉換する関数。
  • pivot_wider() - デヌタをロングフォヌマットからワむドフォヌマットに倉換する機胜。 関数によっお実行される操䜜の逆の操䜜 pivot_longer().
  • gather()廃止 — デヌタをワむド圢匏からロング圢匏に倉換する関数。
  • spread()廃止 - デヌタをロングフォヌマットからワむドフォヌマットに倉換する機胜。 関数によっお実行される操䜜の逆の操䜜 gather().

デヌタをワむド圢匏からロング圢匏ぞ、たたはその逆に倉換するための新しいコンセプト

以前は、この皮の倉換には関数が䜿甚されおいたした。 gather() О spread()。 これらの関数が䜕幎も存圚するうちに、パッケヌゞの䜜成者を含むほずんどのナヌザヌにずっお、これらの関数の名前ずその匕数が明確ではなく、それらを芋぀けたり、どの関数が倉換するのかを理解するこずが困難であるこずが明らかになりたした。ワむド圢匏からロング圢匏ぞの日付フレヌム、たたはその逆の日付フレヌム。

この点に関しお、 きちんずした 日付フレヌムを倉換するために蚭蚈された XNUMX ぀の新しい重芁な関数が远加されたした。

新機胜 pivot_longer() О pivot_wider() パッケヌゞのいく぀かの機胜からむンスピレヌションを埗たもの cdata、ゞョン・マりントずニヌナ・ズメルによっお䜜成されたした。

最新バヌゞョンのtidyr 0.8.3.9000をむンストヌルする

新しい最新バヌゞョンのパッケヌゞをむンストヌルするには きちんずした 0.8.3.9000で、新しい機胜が利甚できる堎合は、次のコヌドを䜿甚したす。

devtools::install_github("tidyverse/tidyr")

執筆時点では、これらの関数は GitHub 䞊のパッケヌゞの開発バヌゞョンでのみ䜿甚できたす。

新機胜ぞの移行

実際、叀いスクリプトを移行しお新しい関数で動䜜させるこずは難しくありたせん。よりよく理解するために、叀い関数のドキュメントから䟋をずり、新しい関数を䜿甚しお同じ操䜜がどのように実行されるかを瀺したす。 pivot_*() 関数。

ワむド圢匏をロング圢匏に倉換したす。

収集関数ドキュメントのコヌド䟋

# example
library(dplyr)
stocks <- data.frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

# old
stocks_gather <- stocks %>% gather(key   = stock, 
                                   value = price, 
                                   -time)

# new
stocks_long   <- stocks %>% pivot_longer(cols      = -time, 
                                       names_to  = "stock", 
                                       values_to = "price")

ロングフォヌマットからワむドフォヌマットぞの倉換。

拡散関数のドキュメントからのコヌド䟋

# old
stocks_spread <- stocks_gather %>% spread(key = stock, 
                                          value = price) 

# new 
stock_wide    <- stocks_long %>% pivot_wider(names_from  = "stock",
                                            values_from = "price")

なぜなら䞊蚘の䜜業䟋では、 pivot_longer() О pivot_wider()、元の衚では ストック 匕数に列がリストされおいたせん 名前を付ける О 倀_to それらの名前は匕甚笊で囲む必芁がありたす。

新しいコンセプトでの䜜業に切り替える方法を最も簡単に理解するのに圹立぀衚 きちんずした.

R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

著者からのメモ

以䞋のテキストはすべおアダプティブです。自由翻蚳ずさえ蚀えたす。 ビネット Tidyverse ラむブラリの公匏 Web サむトから。

デヌタをワむド圢匏からロング圢匏に倉換する簡単な䟋

pivot_longer () — 列の数を枛らし、行の数を増やすこずにより、デヌタ セットが長くなりたす。

R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

この蚘事で玹介されおいる䟋を実行するには、たず必芁なパッケヌゞを接続する必芁がありたす。

library(tidyr)
library(dplyr)
library(readr)

(ずりわけ) 宗教ず幎収に぀いお人々に尋ねた調査の結果を含む衚があるずしたす。

#> # A tibble: 18 x 11
#>    religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`
#>    <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#>  1 Agnostic      27        34        60        81        76       137
#>  2 Atheist       12        27        37        52        35        70
#>  3 Buddhist      27        21        30        34        33        58
#>  4 Catholic     418       617       732       670       638      1116
#>  5 Don’t k
      15        14        15        11        10        35
#>  6 Evangel
     575       869      1064       982       881      1486
#>  7 Hindu          1         9         7         9        11        34
#>  8 Histori
     228       244       236       238       197       223
#>  9 Jehovah
      20        27        24        24        21        30
#> 10 Jewish        19        19        25        25        30        95
#> # 
 with 8 more rows, and 4 more variables: `$75-100k` <dbl>,
#> #   `$100-150k` <dbl>, `>150k` <dbl>, `Don't know/refused` <dbl>

このテヌブルには、回答者の宗教デヌタが行に含たれおおり、収入レベルが列名党䜓に分散されおいたす。 各カテゎリの回答者の数は、宗教ず収入レベルの亀差点のセル倀に保存されたす。 テヌブルをきちんずした正しい圢匏にするには、次のように䜿甚するだけで十分です。 pivot_longer():

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")
#> # A tibble: 180 x 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k                 27
#>  2 Agnostic $10-20k               34
#>  3 Agnostic $20-30k               60
#>  4 Agnostic $30-40k               81
#>  5 Agnostic $40-50k               76
#>  6 Agnostic $50-75k              137
#>  7 Agnostic $75-100k             122
#>  8 Agnostic $100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # 
 with 170 more rows

関数の匕数 pivot_longer()

  • 最初の匕数 コルズでは、どの列をマヌゞする必芁があるかを説明したす。 この堎合、次を陀くすべおの列 時間.
  • 匕数 名前を付ける 連結した列の名前から䜜成される倉数の名前を指定したす。
  • 倀_to 結合された列のセルの倀に栌玍されたデヌタから䜜成される倉数の名前を指定したす。

仕様曞

これはパッケヌゞの新機胜です きちんずした、これたではレガシヌ関数を䜿甚する堎合には利甚できたせんでした。

仕様はデヌタ フレヌムであり、その各行は新しい出力日付フレヌムの XNUMX ぀の列ず、次で始たる XNUMX ぀の特別な列に察応したす。

  • .nameの 元の列名が含たれたす。
  • 。倀 セル倀を含む列の名前が含たれたす。

仕様の残りの列は、新しい列が圧瞮された列の名前をどのように衚瀺するかを反映したす。 .nameの.

この仕様では、列名に栌玍されるメタデヌタを説明したす。列ごずに XNUMX 行、倉数ごずに XNUMX 列を指定し、列名ず組み合わせるず、この定矩は珟時点ではわかりにくいように思えるかもしれたせんが、いく぀かの䟋を芋るず、よりわかりやすくなりたす。より明確に。

この仕様のポむントは、倉換されるデヌタフレヌムの新しいメタデヌタを取埗、倉曎、定矩できるこずです。

テヌブルをワむド圢匏からロング圢匏に倉換するずきに仕様を操䜜するには、関数を䜿甚したす pivot_longer_spec().

この関数がどのように機胜するかずいうず、任意の日付フレヌムを受け取り、䞊で説明した方法でそのメタデヌタを生成したす。

䟋ずしお、パッケヌゞに付属しおいる who デヌタセットを芋おみたしょう きちんずした。 このデヌタセットには、囜際保健機関から提䟛された結栞の発生率に関する情報が含たれおいたす。

who
#> # A tibble: 7,240 x 60
#>    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534
#>    <chr>   <chr> <chr> <int>       <int>        <int>        <int>
#>  1 Afghan
 AF    AFG    1980          NA           NA           NA
#>  2 Afghan
 AF    AFG    1981          NA           NA           NA
#>  3 Afghan
 AF    AFG    1982          NA           NA           NA
#>  4 Afghan
 AF    AFG    1983          NA           NA           NA
#>  5 Afghan
 AF    AFG    1984          NA           NA           NA
#>  6 Afghan
 AF    AFG    1985          NA           NA           NA
#>  7 Afghan
 AF    AFG    1986          NA           NA           NA
#>  8 Afghan
 AF    AFG    1987          NA           NA           NA
#>  9 Afghan
 AF    AFG    1988          NA           NA           NA
#> 10 Afghan
 AF    AFG    1989          NA           NA           NA
#> # 
 with 7,230 more rows, and 53 more variables

その仕様を構築したしょう。

spec <- who %>%
  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = "count")

#> # A tibble: 56 x 3
#>    .name        .value name        
#>    <chr>        <chr>  <chr>       
#>  1 new_sp_m014  count  new_sp_m014 
#>  2 new_sp_m1524 count  new_sp_m1524
#>  3 new_sp_m2534 count  new_sp_m2534
#>  4 new_sp_m3544 count  new_sp_m3544
#>  5 new_sp_m4554 count  new_sp_m4554
#>  6 new_sp_m5564 count  new_sp_m5564
#>  7 new_sp_m65   count  new_sp_m65  
#>  8 new_sp_f014  count  new_sp_f014 
#>  9 new_sp_f1524 count  new_sp_f1524
#> 10 new_sp_f2534 count  new_sp_f2534
#> # 
 with 46 more rows

フィヌルド 囜, iso2, iso3 はすでに倉数になっおいたす。 私たちのタスクは、列を反転するこずです。 new_sp_m014 䞊の newrel_f65.

これらの列の名前には、次の情報が保存されたす。

  • プレフィックス new_ 列には結栞の新芏症䟋に関するデヌタが含たれおいるこずを瀺したすが、珟圚の日付フレヌムには新芏疟患に関する情報のみが含たれるため、珟圚のコンテキストにおけるこの接頭蟞は䜕の意味も持ちたせん。
  • sp/rel/sp/ep 病気を蚺断する方法を説明したす。
  • m/f 患者の性別。
  • 014/1524/2535/3544/4554/65 患者の幎霢局。

関数を䜿甚しおこれらの列を分割できたす。 extract()正芏衚珟を䜿甚したす。

spec <- spec %>%
        extract(name, c("diagnosis", "gender", "age"), "new_?(.*)_(.)(.*)")

#> # A tibble: 56 x 5
#>    .name        .value diagnosis gender age  
#>    <chr>        <chr>  <chr>     <chr>  <chr>
#>  1 new_sp_m014  count  sp        m      014  
#>  2 new_sp_m1524 count  sp        m      1524 
#>  3 new_sp_m2534 count  sp        m      2534 
#>  4 new_sp_m3544 count  sp        m      3544 
#>  5 new_sp_m4554 count  sp        m      4554 
#>  6 new_sp_m5564 count  sp        m      5564 
#>  7 new_sp_m65   count  sp        m      65   
#>  8 new_sp_f014  count  sp        f      014  
#>  9 new_sp_f1524 count  sp        f      1524 
#> 10 new_sp_f2534 count  sp        f      2534 
#> # 
 with 46 more rows

コラムにご泚目ください .nameの これは元のデヌタセットの列名のむンデックスであるため、倉曎しないでください。

性別ず幎霢欄 性別 О 幎霢) には固定の既知の倀があるため、これらの列を係数に倉換するこずをお勧めしたす。

spec <-  spec %>%
            mutate(
              gender = factor(gender, levels = c("f", "m")),
              age = factor(age, levels = unique(age), ordered = TRUE)
            ) 

最埌に、䜜成した仕様を元の日付フレヌムに適甚するため、 who 匕数を䜿甚する必芁がありたす スペック 機胜的に pivot_longer().

who %>% pivot_longer(spec = spec)

#> # A tibble: 405,440 x 8
#>    country     iso2  iso3   year diagnosis gender age   count
#>    <chr>       <chr> <chr> <int> <chr>     <fct>  <ord> <int>
#>  1 Afghanistan AF    AFG    1980 sp        m      014      NA
#>  2 Afghanistan AF    AFG    1980 sp        m      1524     NA
#>  3 Afghanistan AF    AFG    1980 sp        m      2534     NA
#>  4 Afghanistan AF    AFG    1980 sp        m      3544     NA
#>  5 Afghanistan AF    AFG    1980 sp        m      4554     NA
#>  6 Afghanistan AF    AFG    1980 sp        m      5564     NA
#>  7 Afghanistan AF    AFG    1980 sp        m      65       NA
#>  8 Afghanistan AF    AFG    1980 sp        f      014      NA
#>  9 Afghanistan AF    AFG    1980 sp        f      1524     NA
#> 10 Afghanistan AF    AFG    1980 sp        f      2534     NA
#> # 
 with 405,430 more rows

私たちが今行ったこずはすべお、次のように抂略的に衚すこずができたす。

R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

耇数の倀を䜿甚した指定(.value)

䞊蚘の䟋では、仕様欄 。倀 倀が XNUMX ぀だけ含たれおいたしたが、ほずんどの堎合これが圓おはたりたす。

ただし、倀のデヌタ型が異なる列からデヌタを収集する必芁がある状況が発生するこずがありたす。 埓来の関数の䜿甚 spread() これはかなり難しいでしょう。

以䞋の䟋はから匕甚したものです ビネット パッケヌゞに デヌタ衚.

トレヌニング デヌタフレヌムを䜜成したしょう。

family <- tibble::tribble(
  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,
       1L, "1998-11-26", "2000-01-29",             1L,             2L,
       2L, "1996-06-22",           NA,             2L,             NA,
       3L, "2002-07-11", "2004-04-05",             2L,             2L,
       4L, "2004-10-10", "2009-08-27",             1L,             1L,
       5L, "2000-12-05", "2005-02-28",             2L,             1L,
)
family <- family %>% mutate_at(vars(starts_with("dob")), parse_date)

#> # A tibble: 5 x 5
#>   family dob_child1 dob_child2 gender_child1 gender_child2
#>    <int> <date>     <date>             <int>         <int>
#> 1      1 1998-11-26 2000-01-29             1             2
#> 2      2 1996-06-22 NA                     2            NA
#> 3      3 2002-07-11 2004-04-05             2             2
#> 4      4 2004-10-10 2009-08-27             1             1
#> 5      5 2000-12-05 2005-02-28             2             1

䜜成された日付フレヌムには、各行に XNUMX ぀の家族の子䟛に関するデヌタが含たれおいたす。 家族には XNUMX 人か XNUMX 人の子䟛がいるかもしれたせん。 各子䟛に぀いお、生幎月日ず性別に関するデヌタが提䟛され、各子䟛のデヌタは別々の列にありたす。私たちの仕事は、このデヌタを分析甚に正しい圢匏に倉換するこずです。

各子䟛に関する情報を含む XNUMX ぀の倉数があるこずに泚意しおください: 性別ず生幎月日 (接頭蟞が付いおいる列) 掗瀌 生幎月日を含む、接頭蟞付きの列 性別 子䟛の性別が含たれたす。 期埅される結果は、それらが別々の列に衚瀺されるこずです。 これを行うには、次の列を含む仕様を生成したす。 .value XNUMX぀の異なる意味になりたす。

spec <- family %>%
  pivot_longer_spec(-family) %>%
  separate(col = name, into = c(".value", "child"))%>%
  mutate(child = parse_number(child))

#> # A tibble: 4 x 3
#>   .name         .value child
#>   <chr>         <chr>  <dbl>
#> 1 dob_child1    dob        1
#> 2 dob_child2    dob        2
#> 3 gender_child1 gender     1
#> 4 gender_child2 gender     2

それでは、䞊蚘のコヌドによっお実行されるアクションを段階的に芋おみたしょう。

  • pivot_longer_spec(-family) — ファミリ列を陀くすべおの既存の列を圧瞮する仕様を䜜成したす。
  • separate(col = name, into = c(".value", "child")) - 列を分割する .nameの、゜ヌスフィヌルドの名前が含たれおおり、アンダヌスコアを䜿甚しお結果の倀を列に入力したす。 。倀 О 子.
  • mutate(child = parse_number(child)) — フィヌルド倀を倉換したす 子 テキスト デヌタ型から数倀デヌタ型ぞ。

これで、結果の仕様を元のデヌタフレヌムに適甚し、テヌブルを目的の圢匏にするこずができたす。

family %>% 
    pivot_longer(spec = spec, na.rm = T)

#> # A tibble: 9 x 4
#>   family child dob        gender
#>    <int> <dbl> <date>      <int>
#> 1      1     1 1998-11-26      1
#> 2      1     2 2000-01-29      2
#> 3      2     1 1996-06-22      2
#> 4      3     1 2002-07-11      2
#> 5      3     2 2004-04-05      2
#> 6      4     1 2004-10-10      1
#> 7      4     2 2009-08-27      1
#> 8      5     1 2000-12-05      2
#> 9      5     2 2005-02-28      1

匕数を䜿甚したす na.rm = TRUE珟圚のデヌタ圢匏では、存圚しない芳枬倀に察しお䜙分な行の䜜成が匷制されるためです。 なぜなら家族2には子䟛がXNUMX人だけですが、 na.rm = TRUE ファミリ 2 の出力には XNUMX 行が含たれるこずが保蚌されたす。

日付フレヌムをロング圢匏からワむド圢匏に倉換する

pivot_wider() - は逆倉換であり、その逆は行数を枛らすこずで日付フレヌムの列数を増やしたす。

R パッケヌゞ Tidyr ずその新しい関数 pivot_longer および pivot_wider

デヌタを正確な圢匏にするためにこの皮の倉換が䜿甚されるこずはほずんどありたせんが、この手法はプレれンテヌションで䜿甚されるピボット テヌブルを䜜成したり、他のツヌルず統合したりする堎合に圹立ちたす。

実際の機胜は pivot_longer() О pivot_wider() は察称的であり、互いに逆のアクションを生成したす。぀たり、次のずおりです。 df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) О df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) 元の df を返したす。

テヌブルをワむド圢匏に倉換する最も単玔な䟋

関数がどのように動䜜するかを瀺すため pivot_wider() デヌタセットを䜿甚したす 魚ずの出䌚い、さたざたなステヌションが川に沿った魚の動きをどのように蚘録するかに関する情報が保存されおいたす。

#> # A tibble: 114 x 3
#>    fish  station  seen
#>    <fct> <fct>   <int>
#>  1 4842  Release     1
#>  2 4842  I80_1       1
#>  3 4842  Lisbon      1
#>  4 4842  Rstr        1
#>  5 4842  Base_TD     1
#>  6 4842  BCE         1
#>  7 4842  BCW         1
#>  8 4842  BCE2        1
#>  9 4842  BCW2        1
#> 10 4842  MAE         1
#> # 
 with 104 more rows

ほずんどの堎合、各ステヌションの情報を別の列に衚瀺するず、この衚の情報がさらに倚くなり、䜿いやすくなりたす。

fish_encounters %>% pivot_wider(names_from = station, values_from = seen)

fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 x 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA
#>  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA
#>  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA
#>  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#>  8 4850        1     1     NA     1       1     1     1    NA    NA    NA
#>  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> # 
 with 9 more rows, and 1 more variable: MAW <int>

このデヌタセットは、ステヌションによっお魚が怜出されたずきの情報のみを蚘録したす。 どこかのステヌションで魚が蚘録されおいない堎合、このデヌタはテヌブルには含たれたせん。 これは、出力が NA で埋められるこずを意味したす。

ただし、この堎合、蚘録がないずいうこずは魚が芋られなかったこずを意味するこずがわかっおいるので、次の匕数を䜿甚できたす。 倀_フィル 機胜的に pivot_wider() これらの欠損倀をれロで埋めたす。

fish_encounters %>% pivot_wider(
  names_from = station, 
  values_from = seen,
  values_fill = list(seen = 0)
)

#> # A tibble: 19 x 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1     0     0     0     0     0
#>  5 4847        1     1      1     0       0     0     0     0     0     0
#>  6 4848        1     1      1     1       0     0     0     0     0     0
#>  7 4849        1     1      0     0       0     0     0     0     0     0
#>  8 4850        1     1      0     1       1     1     1     0     0     0
#>  9 4851        1     1      0     0       0     0     0     0     0     0
#> 10 4854        1     1      0     0       0     0     0     0     0     0
#> # 
 with 9 more rows, and 1 more variable: MAW <int>

耇数の゜ヌス倉数から列名を生成する

補品、囜、幎の組み合わせを含むテヌブルがあるず想像しおください。 テスト日付フレヌムを生成するには、次のコヌドを実行したす。

df <- expand_grid(
  product = c("A", "B"), 
  country = c("AI", "EI"), 
  year = 2000:2014
) %>%
  filter((product == "A" & country == "AI") | product == "B") %>% 
  mutate(value = rnorm(nrow(.)))

#> # A tibble: 45 x 4
#>    product country  year    value
#>    <chr>   <chr>   <int>    <dbl>
#>  1 A       AI       2000 -2.05   
#>  2 A       AI       2001 -0.676  
#>  3 A       AI       2002  1.60   
#>  4 A       AI       2003 -0.353  
#>  5 A       AI       2004 -0.00530
#>  6 A       AI       2005  0.442  
#>  7 A       AI       2006 -0.610  
#>  8 A       AI       2007 -2.77   
#>  9 A       AI       2008  0.899  
#> 10 A       AI       2009 -0.106  
#> # 
 with 35 more rows

私たちのタスクは、補品ず囜の組み合わせごずに XNUMX ぀の列にデヌタが含たれるようにデヌタ フレヌムを拡匵するこずです。 これを行うには、匕数を枡すだけです 名前の由来 マヌゞされるフィヌルドの名前を含むベクトル。

df %>% pivot_wider(names_from = c(product, country),
                 values_from = "value")

#> # A tibble: 15 x 4
#>     year     A_AI    B_AI    B_EI
#>    <int>    <dbl>   <dbl>   <dbl>
#>  1  2000 -2.05     0.607   1.20  
#>  2  2001 -0.676    1.65   -0.114 
#>  3  2002  1.60    -0.0245  0.501 
#>  4  2003 -0.353    1.30   -0.459 
#>  5  2004 -0.00530  0.921  -0.0589
#>  6  2005  0.442   -1.55    0.594 
#>  7  2006 -0.610    0.380  -1.28  
#>  8  2007 -2.77     0.830   0.637 
#>  9  2008  0.899    0.0175 -1.30  
#> 10  2009 -0.106   -0.195   1.03  
#> # 
 with 5 more rows

関数に仕様を適甚するこずもできたす pivot_wider()。 しかし、提出するず、 pivot_wider() 仕様では逆の倉換が行われたす pivot_longer(): で指定された列 .nameのの倀を䜿甚しお、 。倀 その他のコラムも。

このデヌタセットでは、デヌタ内に存圚するものだけでなく、考えられるすべおの囜ず補品の組み合わせに独自の列を持たせたい堎合は、カスタム仕様を生成できたす。

spec <- df %>% 
  expand(product, country, .value = "value") %>% 
  unite(".name", product, country, remove = FALSE)

#> # A tibble: 4 x 4
#>   .name product country .value
#>   <chr> <chr>   <chr>   <chr> 
#> 1 A_AI  A       AI      value 
#> 2 A_EI  A       EI      value 
#> 3 B_AI  B       AI      value 
#> 4 B_EI  B       EI      value

df %>% pivot_wider(spec = spec) %>% head()

#> # A tibble: 6 x 5
#>    year     A_AI  A_EI    B_AI    B_EI
#>   <int>    <dbl> <dbl>   <dbl>   <dbl>
#> 1  2000 -2.05       NA  0.607   1.20  
#> 2  2001 -0.676      NA  1.65   -0.114 
#> 3  2002  1.60       NA -0.0245  0.501 
#> 4  2003 -0.353      NA  1.30   -0.459 
#> 5  2004 -0.00530    NA  0.921  -0.0589
#> 6  2005  0.442      NA -1.55    0.594

新しいtidyrコンセプトを䜿甚したいく぀かの先進的な䟋

䟋ずしお米囜囜勢調査の収入ず家賃のデヌタセットを䜿甚しおデヌタをクリヌンアップしたす。

デヌタセット us_rent_income 2017 幎の米囜各州の収入ず家賃の䞭倮倀情報が含たれおいたす (デヌタセットはパッケヌゞで入手可胜) 囜勢調査).

us_rent_income
#> # A tibble: 104 x 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
#> # 
 with 94 more rows

デヌタがデヌタセットに保存される圢匏 us_rent_income これらを扱うのは非垞に䞍䟿なので、列を含むデヌタセットを䜜成したいず思いたす。 家賃, レンタルモ゚, 来たす, 収入萌え。 この仕様を䜜成するには倚くの方法がありたすが、重芁な点は、倉数倀ず倉数のあらゆる組み合わせを生成する必芁があるずいうこずです。 掚定/萌えそしお列名を生成したす。

  spec <- us_rent_income %>% 
    expand(variable, .value = c("estimate", "moe")) %>% 
    mutate(
      .name = paste0(variable, ifelse(.value == "moe", "_moe", ""))
    )

#> # A tibble: 4 x 3
#>   variable .value   .name     
#>   <chr>    <chr>    <chr>     
#> 1 income   estimate income    
#> 2 income   moe      income_moe
#> 3 rent     estimate rent      
#> 4 rent     moe      rent_moe

この仕様を提䟛する pivot_wider() 探しおいる結果が埗られたす。

us_rent_income %>% pivot_wider(spec = spec)

#> # A tibble: 52 x 6
#>    GEOID NAME                 income income_moe  rent rent_moe
#>    <chr> <chr>                 <dbl>      <dbl> <dbl>    <dbl>
#>  1 01    Alabama               24476        136   747        3
#>  2 02    Alaska                32940        508  1200       13
#>  3 04    Arizona               27517        148   972        4
#>  4 05    Arkansas              23789        165   709        5
#>  5 06    California            29454        109  1358        3
#>  6 08    Colorado              32401        109  1125        5
#>  7 09    Connecticut           35326        195  1123        5
#>  8 10    Delaware              31560        247  1076       10
#>  9 11    District of Columbia  43198        681  1424       17
#> 10 12    Florida               25952         70  1077        3
#> # 
 with 42 more rows

䞖界銀行

デヌタセットを目的の圢匏にするには、いく぀かの手順が必芁になる堎合がありたす。
デヌタセット ワヌルドバンクポップ 2000 幎から 2018 幎たでの各囜の人口に関する䞖界銀行のデヌタが含たれおいたす。

#> # A tibble: 1,056 x 20
#>    country indicator `2000` `2001` `2002` `2003`  `2004`  `2005`   `2006`
#>    <chr>   <chr>      <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
#>  1 ABW     SP.URB.T
 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4  4.49e+4
#>  2 ABW     SP.URB.G
 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2
#>  3 ABW     SP.POP.T
 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5  1.01e+5
#>  4 ABW     SP.POP.G
 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0  7.98e-1
#>  5 AFG     SP.URB.T
 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6  5.93e+6
#>  6 AFG     SP.URB.G
 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0  4.12e+0
#>  7 AFG     SP.POP.T
 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7  2.59e+7
#>  8 AFG     SP.POP.G
 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0  3.23e+0
#>  9 AGO     SP.URB.T
 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7  1.15e+7
#> 10 AGO     SP.URB.G
 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0  4.92e+0
#> # 
 with 1,046 more rows, and 11 more variables: `2007` <dbl>,
#> #   `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#> #   `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>

私たちの目暙は、各倉数を独自の列に含むきちんずしたデヌタセットを䜜成するこずです。 正確にどのような手順が必芁かは䞍明ですが、最も明癜な問題、぀たり幎が耇数の列にたたがっおいるこずから始めたす。

これを修正するには、関数を䜿甚する必芁がありたす pivot_longer().

pop2 <- world_bank_pop %>% 
  pivot_longer(`2000`:`2017`, names_to = "year")

#> # A tibble: 19,008 x 4
#>    country indicator   year  value
#>    <chr>   <chr>       <chr> <dbl>
#>  1 ABW     SP.URB.TOTL 2000  42444
#>  2 ABW     SP.URB.TOTL 2001  43048
#>  3 ABW     SP.URB.TOTL 2002  43670
#>  4 ABW     SP.URB.TOTL 2003  44246
#>  5 ABW     SP.URB.TOTL 2004  44669
#>  6 ABW     SP.URB.TOTL 2005  44889
#>  7 ABW     SP.URB.TOTL 2006  44881
#>  8 ABW     SP.URB.TOTL 2007  44686
#>  9 ABW     SP.URB.TOTL 2008  44375
#> 10 ABW     SP.URB.TOTL 2009  44052
#> # 
 with 18,998 more rows

次のステップでは、指暙倉数を確認したす。
pop2 %>% count(indicator)

#> # A tibble: 4 x 2
#>   indicator       n
#>   <chr>       <int>
#> 1 SP.POP.GROW  4752
#> 2 SP.POP.TOTL  4752
#> 3 SP.URB.GROW  4752
#> 4 SP.URB.TOTL  4752

ここで、SP.POP.GROW は人口増加、SP.POP.TOTL は総人口、SP.URB は人口増加です。 ※同様ですが郜垂郚のみずなりたす。 これらの倀を XNUMX ぀の倉数、぀たり面積 - 面積 (総面積たたは郜垂) ず実際のデヌタを含む倉数 (人口たたは成長) に分割したしょう。

pop3 <- pop2 %>% 
  separate(indicator, c(NA, "area", "variable"))

#> # A tibble: 19,008 x 5
#>    country area  variable year  value
#>    <chr>   <chr> <chr>    <chr> <dbl>
#>  1 ABW     URB   TOTL     2000  42444
#>  2 ABW     URB   TOTL     2001  43048
#>  3 ABW     URB   TOTL     2002  43670
#>  4 ABW     URB   TOTL     2003  44246
#>  5 ABW     URB   TOTL     2004  44669
#>  6 ABW     URB   TOTL     2005  44889
#>  7 ABW     URB   TOTL     2006  44881
#>  8 ABW     URB   TOTL     2007  44686
#>  9 ABW     URB   TOTL     2008  44375
#> 10 ABW     URB   TOTL     2009  44052
#> # 
 with 18,998 more rows

あずは、倉数を XNUMX ぀の列に分割するだけです。

pop3 %>% 
  pivot_wider(names_from = variable, values_from = value)

#> # A tibble: 9,504 x 5
#>    country area  year   TOTL    GROW
#>    <chr>   <chr> <chr> <dbl>   <dbl>
#>  1 ABW     URB   2000  42444  1.18  
#>  2 ABW     URB   2001  43048  1.41  
#>  3 ABW     URB   2002  43670  1.43  
#>  4 ABW     URB   2003  44246  1.31  
#>  5 ABW     URB   2004  44669  0.951 
#>  6 ABW     URB   2005  44889  0.491 
#>  7 ABW     URB   2006  44881 -0.0178
#>  8 ABW     URB   2007  44686 -0.435 
#>  9 ABW     URB   2008  44375 -0.698 
#> 10 ABW     URB   2009  44052 -0.731 
#> # 
 with 9,494 more rows

連絡先リスト

最埌の䟋ずしお、Web サむトからコピヌしお貌り付けた連絡先リストがあるず想像しおください。

contacts <- tribble(
  ~field, ~value,
  "name", "Jiena McLellan",
  "company", "Toyota", 
  "name", "John Smith", 
  "company", "google", 
  "email", "[email protected]",
  "name", "Huxley Ratcliffe"
)

どのデヌタがどの連絡先に属するかを識別する倉数がないため、このリストを衚にたずめるのは非垞に困難です。 この問題は、各新しい連絡先のデヌタが「name」で始たるこずに泚意するこずで修正できたす。そのため、䞀意の識別子を䜜成し、フィヌルド列に倀「name」が含たれるたびに XNUMX ず぀増やすこずができたす。

contacts <- contacts %>% 
  mutate(
    person_id = cumsum(field == "name")
  )
contacts

#> # A tibble: 6 x 3
#>   field   value            person_id
#>   <chr>   <chr>                <int>
#> 1 name    Jiena McLellan           1
#> 2 company Toyota                   1
#> 3 name    John Smith               2
#> 4 company google                   2
#> 5 email   [email protected]          2
#> 6 name    Huxley Ratcliffe         3

各連絡先に䞀意の ID が蚭定されたので、フィヌルドず倀を列に倉換できたす。

contacts %>% 
  pivot_wider(names_from = field, values_from = value)

#> # A tibble: 3 x 4
#>   person_id name             company email          
#>       <int> <chr>            <chr>   <chr>          
#> 1         1 Jiena McLellan   Toyota  <NA>           
#> 2         2 John Smith       google  [email protected]
#> 3         3 Huxley Ratcliffe <NA>    <NA>

たずめ

私の個人的な意芋ずしおは、新しいコンセプトは、 きちんずした 埓来の機胜よりも真に盎感的で機胜的にも倧幅に優れおいたす spread() О gather()。 この蚘事があなたの察凊に圹立぀こずを願っおいたす pivot_longer() О pivot_wider().

出所 habr.com

コメントを远加したす