R: よこ長データをたて長にする新しい方法, tidyr, pivot_longer

tidyrが1.0.0となり、pivot_longerpivot_widerが導入されました。

これまでデータのたて長とよこ長を変換するのに使われていたgatherとspreadに代わるものです。ただし、gatherもspreadもこれまでどおり使えます。

pivot_longerの使い方を5つのサンプルで説明します。2−5のサンプルは次の文書のものです。

 

pivot_longer: Pivot data from wide to long

 

Sample 1

 

11人の学生の語彙試験6回の試験結果の表です。よこ長データをたて長にします。

 

 

スクリプトは次です。goi1:goi6でたて長にする列を指定しますが、-nameとしてname列を除外しても同じ結果になります。

 

# install the development version of tidyverse
library(devtools)
devtools::install_github("hadley/tidyverse")
library(tidyverse)
# sample 1
df1 <- read_csv("https://pastebin.com/raw/pCvBzgBu")
df1_1 <- df1 %>%
pivot_longer(
goi1:goi6, # -nameとしても同じ
names_to = "test", # 列名をtest列にまとめる
names_prefix = "goi", # 列名のgoiを除く
values_to = "score") # 得点をscore列にまとめる
 

 

 

たて長デーダなら、ggplotの簡単な式でグラフを作成できます。

 

# Basic line plot with points
ggplot(data=df1, aes(x=tests, y=score, color=name, group=name)) +
geom_line() +
geom_point()
 

 

 

Sample 2

 

 

スクリプトは次です。

-religionreligion以外の列を指定しています。

 

# sample2
df2 <- read_csv("https://raw.githubusercontent.com/tidyverse/tidyr/master/data-raw/relig_income.csv")
df2
df2_1 <- df2 %>%
pivot_longer(
-religion,
names_to = "income",
values_to = "count")
df2_1

 

 

Sample 3

 

 

スクリプトは次です。starts_with(“”)でたて長にする列を列名の初めの部分で指定しています。names_prefix=””で列名の初めの部分を削除しています。

 

# sample 3
df3 <- read_csv("https://raw.githubusercontent.com/hadley/tidy-data/master/data/billboard.csv")
df3
df3_1 <- df3 %>%
pivot_longer(
cols = starts_with("x"), # xではじまる列をまとめる
names_to = "week", # 新たな列名をweekに
names_prefix = "x", # 列名の先頭のxを削除する
values_to = "rank", # 数値列名をrannkにする
values_drop_na = TRUE # NA行を削除
)
df3_1
 

 

Sample 4

 

WHOの結核に関するデータをたて長にします。Sample 1-4もそうでしたが、これもread_csv()で読み込みます。

Rのベースのread.csv()と違って、ページ幅に表示できない列を下に回り込ませずに省略し、見えない列の列名を表の下に表示します。このため、たいへんわかりやすい表示になります。

下の図のように7列のみ表示されていますが、全体は5769行、23列ですから16列が表示されていないことがわかります。

さて、このデータの列名を見ると規則的なタイトルになっていることがわかります。この列名から、各列のデータを診断結果と性別と年齢に振り分けます。

のをからdiagnosisとgenderとageに分けたいです。

1つ目の_の後が診断結果(diagnosis)です。2つ目の_の後が性別(gender)で、その後が年齢(age)です。年齢の長い数字、例えば、1524は15歳から24歳の年齢階層だと思います。

 

 

上の図の最後の3行を、pivot_longerは次の式で仕分けします。”.“は列にするデータの位置を指定する記号です。*はいわゆるワイルドカードで、何が書かれていてもかまわないということを表わしています。

 

names_pattern = "new_?(.*)_(.)(.*)" 

 

式は次のようになります。

 

# Multiple variables stored in colum names
df4 <- read_csv("https://raw.githubusercontent.com/hadley/tidy-data/master/data/tb.csv")
df4
df4_1 <- df4 %>% pivot_longer(
cols = new_sp_m04:new_sp_f65,
names_to = c("diagnosis", "gender", "age"),
names_pattern = "new_?(.*)_(.)(.*)",
values_to = "count"
)
df4_1
 

 

次のようにたて長の表が作成されます。このようにdiagnosisやgenderやageを列としてまとめておくと、ggplot2で列を指定するだけで、診断結果別、男女別、年齢別のグラフを描くことができます。

 

 

Sample 5

 

データはグラフ化の重要性を示した有名なAnscombe’s Quartetです。

x1とy1、x2とy2、x3とy3、x4とy4がペアとなるデータなので、たて長に変換したときに、この関係を残す必要があります。このためにset列をつくり、1−4を割り振ります。

 

スクリプトは次です。

 

# Multiple observations per row
df5 <- anscombe # a sample dataset of R
df5
df5_1 <- df5 %>%
pivot_longer(
everything(), # 前列を対象
names_to = c(".value", "set"), # 次に指定の文字とsetの列を作成
names_pattern = "(.)(.)" # 列名の第1文字と第2文字を指定
)
df5_1df5_1
 

 

to be continued

Please follow and like us:
error

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.