R言語による医療データ分析

R言語によるデータ分析のオンラインコースを中心に、さまざまなデータ分析について記載してあります。

098-100 gather&spread

まとめ一覧

データの方向の転換

  • gatherとspreadの解説を行います。
  • ただし、tidyrのV1.1以降では、pivot_longer, pivot_widerという新しい関数が導入されています
  • 考え方はほぼ一緒ですが、pivot_XXX系の関数の方ができることが増えているので、これから学ばれる方はpivot_XXX系の関数を利用することをお勧めします。
  • gather <-> pivot_longer
  • spread <-> piot_wider

gather

  • gatherの処理のまとめは次のような形です

f:id:tentencon:20191221165244j:plain


f:id:tentencon:20191221165319j:plain


f:id:tentencon:20191221165346j:plain


f:id:tentencon:20191221165408j:plain


f:id:tentencon:20191221165432j:plain


  • 実際にデータに適応してみると。。
#横持データ
dfyoko <- tibble(
  tosi = c("札幌","東京","那覇"),
  `2018-04-01` = c("晴れ", "雨", "曇り"),
  `2018-04-02` = c("雨", "雨", "晴れ"),
  `2018-04-03` = c("晴れ", "雨", "曇り"),
  `2018-04-04` = c("晴れ", "雨", "雨")
)
  • このdfyokoは典型的な「横持データ」と呼ばれているものです。
  • 人には見やすいですが、tidyなデータではないということはお判りでしょうか?
dfyoko <- tibble(
  tosi = c("札幌","東京","那覇"),
  `2018-04-01` = c("晴れ", "雨", "曇り"),
  `2018-04-02` = c("雨", "雨", "晴れ"),
  `2018-04-03` = c("晴れ", "雨", "曇り"),
  `2018-04-04` = c("晴れ", "雨", "雨")
)

dfyoko <- 
  dfyoko %>% 
  gather(-tosi, key=date_tenki, value = tenki)
  • 尚、pivot_longerで書く場合は
    • key <-> names_to
    • value <-> values_to
dfyoko %>% 
  pivot_longer(cols = -c(tosi), names_to = "date_tenki", values_to = "tenki")

spread

  • spreadの処理をまとめると次のような形です

f:id:tentencon:20191222101313j:plain


f:id:tentencon:20191222101331j:plain


f:id:tentencon:20191222101403j:plain


f:id:tentencon:20191222101424j:plain


  • dfyokoをもとの横持ちデータにもどしてみます。
dfyoko <- dfyoko %>% 
  spread(key = date_tenki, value = tenki)

#注、dateを列名でつかわないほうがよい理由:スライドでは、dateをつかっていましたが、dateはもともと関数です。エラーが生じるので、基本的には列名やオブジェクトの名前に他の関数と同じ名前を付けることは避けてください。
  • よくあるエラー
dfyoko_error <- 
  tibble(
    tosi = c(rep("札幌",4)),
    hiduke = c("2018-04-01","2018-04-02","2018-04-03","2018-04-01"),
    tenki = c("晴れ","雨","雨","雨")
)

dfyoko_error

dfyoko <- 
  dfyoko_error %>% 
  spread(key = hiduke, value = tenki)
  • Error: Duplicate identifiers for rows (1, 4)
  • このような表示がでるのは、なぜでしょうか?
  • 1行目と4行目のIdentifiers(札幌かつ2018-04-01)がDuplicate(重複)してますね。
  • 手でこのtibbleを横方向にしようとしても、2018年4月1日の札幌の天気はどっち(晴れ/雨)なんだと悩みます。

  • こういったエラーの対処については、どのようにしてこの事態が発生したか、発生のメカニズムによって対処方法が違います。

  • ここでは、その内容には踏み込みません

  • 尚、単純に同じデータが二回記録されているようなケースでは、

df_dup <- 
  tibble(
    tosi = c(rep("札幌",4)),
    hiduke = c("2018-04-01","2018-04-02","2018-04-03","2018-04-01"),
    tenki = c("雨","雨","雨","雨")
  )

df_dup

df_dup <- 
   df_dup %>% distinct()
  • とすることにより、重複列が削除されますので、
df_dup <- 
  df_dup %>% distinct() %>% 
  spread(key = hiduke, value = tenki)

#横持にできます!

まとめ一覧