はじめに
この記事は前回の続編という立ち位置になっています。今回は特に多く使われるであろうpivot_longer()
の引数あれこれについてです。
nemes_prefixで列名の削除
以下のような雑然データがあるとします
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
を指定すると...
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 =
という引数です。これを用いることで各変数名の先頭から一致するテキストを削除することが可能となります。つまり、
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
です。
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()
へとシフトしていくのではないでしょうか?