LoginSignup
5
7

More than 3 years have passed since last update.

【tidyr】gather?, spread? もう古い。時代はpivot - 2

Last updated at Posted at 2019-10-03

はじめに

この記事は前回の続編という立ち位置になっています。今回は特に多く使われるであろうpivot_longer()の引数あれこれについてです。

nemes_prefixで列名の削除

以下のような雑然データがあるとします

messy.R
library(tidyverse)


df <- tibble("店舗" = c("a", "b", "c", "d"),
             "Day1" = c(90, 73, 60, 30),
             "Day2" = c(50, 78, 81, 100),
             "Day3" = c(20, 50, 70, 87),
             "Day4" = c(20, 50, 70, 87),
             "Day5" = c(98, 100, 89, 15)
             )
df

# A tibble: 4 x 6
 店舗   Day1  Day2  Day3  Day4  Day5
  <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 a        90    50    20    20    98
2 b        73    78    50    50   100
3 c        60    81    70    70    89
4 d        30   100    87    87    15

このような場合、通常の方法でcol, name_to, value_toを指定すると...

tidy?.R
df %>% 
pivot_longer(cols = -店舗, names_to = "日", values_to = "売上") %>%
head()

# A tibble: 20 x 3
   店舗       売上
   <chr> <chr> <dbl>
 1 a     Day1     90
 2 a     Day2     50
 3 a     Day3     20
 4 a     Day4     20
 5 a     Day5     98
 6 b     Day1     73

このままではの列に格納される際、Dayという余計な文字が入ってしまいます。このような状況を回避するときに用いるのがnemes_prefix =という引数です。これを用いることで各変数名の先頭から一致するテキストを削除することが可能となります。つまり、

tidy!.R

df %>% pivot_longer(cols = -店舗, names_to = "日", 
                    names_prefix = "Day", 
                    values_to = "売上"
                    ) %>%
  head()

# A tibble: 6 x 3
  店舗       売上
  <chr> <chr> <dbl>
1 a     1        90
2 a     2        50
3 a     3        20
4 a     4        20
5 a     5        98
6 b     1        73

このようにすることで、の列に格納される際、Dayを削除することができました。

names_ptypesで列の型変換

しかし!このままでもまだ問題が残っています。それはの列の型がcharacterのままになっている点ですas.numeric()/as.integer()を用いてもいいのですが、直接pivot_longer()内の引数を用いても数値型に変換することができます。それがnames_ptypesです。

tidy!_int.R

df %>% pivot_longer(cols = -店舗, names_to = "日", 
                    names_prefix = "Day", 
                    names_ptypes = list("日" = integer()), 
                    values_to = "売上"
                    ) %>%
  head()

# A tibble: 6 x 3
  店舗       売上
  <chr> <int> <dbl>
1 a         1    90
2 a         2    50
3 a         3    20
4 a         4    20
5 a         5    98
6 b         1    73

この結果、日の列の型をintに変更できました。これらの機能は従来のgahter()で行うことはできないことからpivot_longer()内で完結させられるようになるのは進歩だと言えるでしょう。

その他の機能

values_drop_na = TRUEを指定することで、欠損値を含む行を無視することができますfilter(!is.na())と同義です。案外便利。

まとめ

今回の記事では、pivot_longer()の引数について簡単に解説しました。従来のgather()から様々な機能を追加されており、使いこなすことで雑然データを1つの関数で整然化することが可能になります。これはコード全体の可読性を高めることにつながるため、今後はgather()からpivot_longer()へとシフトしていくのではないでしょうか?

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7