R オブジェクトのシリアル化:
Rda、Rds 及び Feather
. 名古屋⼤学 国際⾔語⽂化研究科M2 于 劭贇|ウ ショウイン s.yu@protonmail.com 2016.7.23 Nagoya.R #16基本概念
.
I. オブジェクトとは
R では、ベクトルから関数まで、
I. オブジェクトとは
# 任意のベクトルを作る。 a <- c(1, 3, 5, 7, 9) # 任意のデータフレームを作る。 b <- data.frame(x = rnorm(100)) # 任意の関数を作る。 f <- function(x, y) { x + y } 2I. オブジェクトとは
> # オブジェクトの⼀覧(ls() の別名) > objects() [1] ”a” ”b” ”f” > # メモリ上のオブジェクトのサイズを調べる。 > object.size(a) 88 bytesII. シリアル化とは
シリアル化(Serialization)とは、オブジェクトの状態を永 続化または転送できる形式に変換するプロセスのことです。 その主な⽬的は、必要なときに再構築できるように、オブ ジェクトの状態を保存することです。 (MSDN より) 4II. シリアル化とは
シリアル化(Serialization)とは、オブジェクトの状態を永 続化または転送できる形式に変換するプロセスのことです。 その主な⽬的は、必要なときに再構築できるように、オブ ジェクトの状態を保存することです。 (MSDN より)II. シリアル化とは
シリアル化を補完するプロセスとして、ストリームをオブ ジェクトに変換する逆シリアル化があります。 これらのプロセスを組み合わせて使⽤することで、データ を簡単に格納および転送できます。 (MSDN より) 5II. シリアル化とは
まとめ
• シリアル化:オブジェクトの状態を保存すること • 逆シリアル化:保存されたオブジェクトを復元すること
シンプルな例
.
サンプルデータ
R 付属のデータセット warpbreaks 同じ⻑さの⽷で布を織る際に、 ⽷切れが起こった回数を数えたデータ。 コラム 内容 breaks ⽷切れの回数 wool ウールのタイプ(A, B) tension ⽷の張⼒(L, M, H)サンプルデータ
> head(warpbreaks) breaks wool tension
1 26 A L 2 30 A L 3 54 A L 4 25 A L 5 70 A L 6 52 A L 8
課題:要因の⽔準の順番を保存する
tension 列の⽔準の本来の順番
張⼒:低– 中 – ⾼
> levels(warpbreaks$tension) [1] ”L” ”M” ”H”
課題:要因の⽔準の順番を保存する
CSV に保存して再び読み込んだら、 tension 列の⽔準の順番がアルファベット順になってしまう。 write.csv(warpbreaks, ’warpbreaks.csv’) wb <- read.csv(’warpbreaks.csv’) > levels(wb$tension) [1] ”H” ”L” ”M” 10課題:要因の⽔準の順番を保存する
このまま箱ひげ図を作ると…
ggplot(wb, aes(x = tension, y = breaks, fill = wool)) +
geom_boxplot() +
20 40 60 H L M tension breaks wool A B 図1:データフレーム wb で作った箱ひげ図 12
課題:要因の⽔準の順番を保存する
やはり「L、M、H」の順番のほうが直感的に分かりやすい。
⽔準の順番を並べ直す。 wb.2 <- wb %>%
mutate(
tension = factor(tension, levels = c(’L’, ’M’, ’H’))
)
> levels(wb.2$tension) [1] ”L” ”M” ”H”
20 40 60 L M H tension breaks wool A B 図2:wb.2 で作図した結果 14
課題:要因の⽔準の順番を保存する
要因の⽔準の順番をどうやって保存するか。 CSV はデータの⻑期保存と交換に向いているが、 要因の⽔準の順番など、データの「状態」を保存できず、 読み込み後もう⼀回並べ直す必要がある。 対策 編集したデータをシリアル化して保存しておけば、 もとの状態を保ったまま、 別の⽬的(e.g. 要約、作図)のために再利⽤できる。課題:要因の⽔準の順番を保存する
要因の⽔準の順番をどうやって保存するか。 CSV はデータの⻑期保存と交換に向いているが、 要因の⽔準の順番など、データの「状態」を保存できず、 読み込み後もう⼀回並べ直す必要がある。 対策 編集したデータをシリアル化して保存しておけば、 もとの状態を保ったまま、 別の⽬的(e.g. 要約、作図)のために再利⽤できる。 15⽅法
1: Rda
.
複数のオブジェクトを保存する
> q()
Save workspace image? [y/n/c]: y
毎⽇出会うシリアル化のフォーマットである。 拡張⼦として.RData または .rda がよく使われる。 R を閉じる時の質問に同意すると、
すべてのオブジェクトが隠しファイル「.RData」に保存される。
save() によるシリアル化
save() 関数は⼀度に複数のオブジェクトを Rda フォーマットで保存できる。
> ls()
[1] ”a” ”b” ”f” ”wb” ”wb.2”
load() による逆シリアル化
load() 関数はRda フォーマットのオブジェクトを復元する。 > # ワークスペースをクリアする。 > rm(list = ls()) > ls() character(0) > # 保存したファイルからオブジェクトを復元する。 > load(’warpbreaks.rda’) > ls() [1] ”wb” ”wb.2” 18load() による逆シリアル化
オブジェクトのもとの状態もきちんと保存される。
> # wb と wb.2 のデータの値は同じである。
> all.equal(wb, wb.2, check.attributes = FALSE)
[1] TRUE > # だが、tension 列の⽔準の順番の違いは > # シリアル化によって保たれている。 > levels(wb$tension) [1] ”H” ”L” ”M” > levels(wb.2$tension)
Rda フォーマットの短所
• 変数名がオブジェクトと⼀緒に保存される。 • 逆シリアル化の時、オブジェクトに新しい変数名を指定するこ とができない。 • load() 関数の場合、オブジェクトが⾃動的にもとの名前で復元 されるため、現在のワークスペースにあるデータを上書きする おそれがある。 20Rda フォーマットの短所
> # wb に新しい値を付与する。 > wb <- c(’foo’, ’bar’) > # 中⾝を覗く。 > str(wb) chr [1:2] ”foo” ”bar”Rda フォーマットの短所
> # 逆シリアル化 > load(’warpbreaks.rda’) > # ⽂字列ベクトルの wb が > # 逆シリアル化されたデータフレームの wb に上書きされる。 > str(wb)’data.frame’: 54 obs. of 3 variables:
$ breaks : int 26 30 54 25 70 52 51 26 67 18 ...
$ wool : Factor w/ 2 levels ”A”,”B”: 1 1 1 1 1 1 1 1 1 1 ...
$ tension: Factor w/ 3 levels ”H”,”L”,”M”: 2 2 2 2 2 2 2 2 2 3
...
⽅法
2: Rds
.
1 つのオブジェクトを 1 つのファイルに保存する
Rds フォーマットは⼀度に1つのオブジェクトのみを保存する。 逆シリアル化の時はオブジェクトに変数名を指定できる。 オブジェクトの保存と復元をより上⼿くコントロールできる。 拡張⼦として .rds がよく使われる。 231 つのオブジェクトを 1 つのファイルに保存する
Rds フォーマットは⼀度に1つのオブジェクトのみを保存する。 逆シリアル化の時はオブジェクトに変数名を指定できる。
オブジェクトの保存と復元をより上⼿くコントロールできる。 拡張⼦として .rds がよく使われる。
saveRDS() 関数によるシリアル化
⼀度に1つのオブジェクトのみを保存する。
> saveRDS(wb, ’wb.rds’)
> saveRDS(wb.2, ’wb.2.rds’)
readRDS() 関数による逆シリアル化
オブジェクトは readRDS() 関数の戻り値として返される。
> str(readRDS(’wb.2.rds’))
’data.frame’: 54 obs. of 3 variables:
$ breaks : int 26 30 54 25 70 52 51 26 67 18 ...
$ wool : Factor w/ 2 levels ”A”,”B”: 1 1 1 1 1 1 1 1 1 1 ...
$ tension: Factor w/ 3 levels ”L”,”M”,”H”: 1 1 1 1 1 1 1 1 1 2
readRDS() 関数による逆シリアル化
> # 指定した変数にオブジェクトを読み込む。 > wb.3 <- readRDS(’wb.2.rds’) > # wb.2 と wb.3 は完全に同じである。 > all.equal(wb.2, wb.3) [1] TRUE 26⽅法
3: Feather
.
他の統計解析環境との互換性
Rda、Rds は R 専⽤ のフォーマットであり、 あらゆるタイプのR オブジェクトをシリアル化できる。 • ベクトル • ⾏列 • リスト • データフレーム • フィットしたモデル • 関数 • … 27他の統計解析環境との互換性
表形式のデータフレームは、
統計解析における中⼼的なデータタイプ。
Feather フォーマットは、R と、Python の pandas パッケージの データフレームの互換 を実現する。
R で Feather を使う
> library(feather) > # データフレームを Feather フォーマットにシリアル化する。 > write_feather(wb.2, ’wb.2.feather’) > # Feather ファイルを読み込む。 > wb.4 <- read_feather(’wb.2.feather’) > # tension 列の⽔準の順番が保たれている。 > levels(wb.4$tension) [1] ”L” ”M” ”H” 29Python で Feather を使う
>>> import feather >>> # Feather ファイルを読み込む。 >>> wb_2 = feather.read_dataframe(’wb.2.feather’) >>> # 最初の 6 ⾏を表⽰する。 >>> wb_2.head(6) breaks wool tension0 26 A L
1 30 A L
2 54 A L
Python で作図してみる
# 作図のためのパッケージ import matplotlib.pyplot as plt import seaborn as sns # スタイルの微調整 sns.set_style(’white’)# Make plots great again!
with plt.xkcd():
sns.boxplot(x=’tension’, y=’breaks’, hue=’wool’, data=wb_2)
ビッグ・ピクチャー
.
ビッグ・ピクチャー
1つのプロジェクトを機能別に複数のスクリプトに分ける。 シリアル化で重要なオブジェクトを保存し、後で再利⽤する。 • model.R データを読み込み、モデルをフィットする。 フィットしたモデルをシリアル化する。 • anlys.R モデルを逆シリアル化し、推定値を抽出し分析する。 分析の結果をデータフレームにまとめ、 シリアル化+CSV に保存する。 • graph.R参考⽂献
I
McKinney, W. & Wickham, H. (2016). Feather: A fast on-disk format for Data Frames for R and Python, powered by
Apache Arrow. Retrieved July 18, 2016, from
https://blog.rstudio.org/2016/03/29/feather/
.NET Framework におけるシリアル化. (n.d.).Retrieved July 18,
2016, from https://msdn.microsoft.com/ja-jp/library/7ay27kt9(v=vs.120).aspx
R FAQ: How does R handle overlapping object names? (n.d.). Retrieved July 18, 2016, from http:
//www.ats.ucla.edu/stat/r/faq/referencing_objects.htm
参考⽂献
II
Simpson, G. (2012). A better way of saving and loading objects in R. Retrieved July 18, 2016, from
http://www.fromthebottomoftheheap.net/2012/04/01/saving-and-loading-r-objects/
Venables, W. N., Smith, D. M., & the R Core Team. (2016, June 21). An introduction to R. Version 3.3.1.
シリアル化(C# および Visual Basic). (n.d.).Retrieved July 18, 2016,
from