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の処理のまとめは次のような形です
- 実際にデータに適応してみると。。
#横持データ 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の処理をまとめると次のような形です
- 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) #横持にできます!