• 検索結果がありません。

R オブジェクトのシリアル化: Rda、Rds 及び Feather -

N/A
N/A
Protected

Academic year: 2021

シェア "R オブジェクトのシリアル化: Rda、Rds 及び Feather -"

Copied!
46
0
0

読み込み中.... (全文を見る)

全文

(1)

R オブジェクトのシリアル化:

Rda、Rds 及び Feather

. 名古屋⼤学 国際⾔語⽂化研究科M2 于 劭贇|ウ ショウイン s.yu@protonmail.com 2016.7.23 Nagoya.R #16

(2)

基本概念

.

(3)

I. オブジェクトとは

R では、ベクトルから関数まで、

(4)

I. オブジェクトとは

# 任意のベクトルを作る。 a <- c(1, 3, 5, 7, 9) # 任意のデータフレームを作る。 b <- data.frame(x = rnorm(100)) # 任意の関数を作る。 f <- function(x, y) { x + y } 2

(5)

I. オブジェクトとは

> # オブジェクトの⼀覧(ls() の別名) > objects() [1] ”a” ”b” ”f” > # メモリ上のオブジェクトのサイズを調べる。 > object.size(a) 88 bytes

(6)

II. シリアル化とは

シリアル化(Serialization)とは、オブジェクトの状態を永 続化または転送できる形式に変換するプロセスのことです。 その主な⽬的は、必要なときに再構築できるように、オブ ジェクトの状態を保存することです。 (MSDN より) 4

(7)

II. シリアル化とは

シリアル化(Serialization)とは、オブジェクトの状態を永 続化または転送できる形式に変換するプロセスのことです。 その主な⽬的は、必要なときに再構築できるように、オブ ジェクトの状態を保存することです。 (MSDN より)

(8)

II. シリアル化とは

シリアル化を補完するプロセスとして、ストリームをオブ ジェクトに変換する逆シリアル化があります。 これらのプロセスを組み合わせて使⽤することで、データ を簡単に格納および転送できます。 (MSDN より) 5

(9)

II. シリアル化とは

まとめ

• シリアル化:オブジェクトの状態を保存すること • 逆シリアル化:保存されたオブジェクトを復元すること

(10)

シンプルな例

.

(11)

サンプルデータ

R 付属のデータセット warpbreaks 同じ⻑さの⽷で布を織る際に、 ⽷切れが起こった回数を数えたデータ。 コラム 内容 breaks ⽷切れの回数 wool ウールのタイプ(A, B) tension ⽷の張⼒(L, M, H)

(12)

サンプルデータ

> 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

(13)

課題:要因の⽔準の順番を保存する

tension 列の⽔準の本来の順番

張⼒:低– 中 – ⾼

> levels(warpbreaks$tension) [1] ”L” ”M” ”H”

(14)

課題:要因の⽔準の順番を保存する

CSV に保存して再び読み込んだら、 tension 列の⽔準の順番がアルファベット順になってしまう。 write.csv(warpbreaks, ’warpbreaks.csv’) wb <- read.csv(’warpbreaks.csv’) > levels(wb$tension) [1] ”H” ”L” ”M” 10

(15)

課題:要因の⽔準の順番を保存する

このまま箱ひげ図を作ると…

ggplot(wb, aes(x = tension, y = breaks, fill = wool)) +

geom_boxplot() +

(16)

20 40 60 H L M tension breaks wool A B 1:データフレーム wb で作った箱ひげ図 12

(17)

課題:要因の⽔準の順番を保存する

やはり「L、M、H」の順番のほうが直感的に分かりやすい。

⽔準の順番を並べ直す。 wb.2 <- wb %>%

mutate(

tension = factor(tension, levels = c(’L’, ’M’, ’H’))

)

> levels(wb.2$tension) [1] ”L” ”M” ”H”

(18)

20 40 60 L M H tension breaks wool A B 2:wb.2 で作図した結果 14

(19)

課題:要因の⽔準の順番を保存する

要因の⽔準の順番をどうやって保存するか。 CSV はデータの⻑期保存と交換に向いているが、 要因の⽔準の順番など、データの「状態」を保存できず、 読み込み後もう⼀回並べ直す必要がある。 対策 編集したデータをシリアル化して保存しておけば、 もとの状態を保ったまま、 別の⽬的(e.g. 要約、作図)のために再利⽤できる。

(20)

課題:要因の⽔準の順番を保存する

要因の⽔準の順番をどうやって保存するか。 CSV はデータの⻑期保存と交換に向いているが、 要因の⽔準の順番など、データの「状態」を保存できず、 読み込み後もう⼀回並べ直す必要がある。 対策 編集したデータをシリアル化して保存しておけば、 もとの状態を保ったまま、 別の⽬的(e.g. 要約、作図)のために再利⽤できる。 15

(21)

⽅法

1: Rda

.

(22)

複数のオブジェクトを保存する

> q()

Save workspace image? [y/n/c]: y

毎⽇出会うシリアル化のフォーマットである。 拡張⼦として.RData または .rda がよく使われる。 R を閉じる時の質問に同意すると、

すべてのオブジェクトが隠しファイル「.RData」に保存される。

(23)

save() によるシリアル化

save() 関数は⼀度に複数のオブジェクトを Rda フォーマットで保存できる。

> ls()

[1] ”a” ”b” ”f” ”wb” ”wb.2”

(24)

load() による逆シリアル化

load() 関数はRda フォーマットのオブジェクトを復元する。 > # ワークスペースをクリアする。 > rm(list = ls()) > ls() character(0) > # 保存したファイルからオブジェクトを復元する。 > load(’warpbreaks.rda’) > ls() [1] ”wb” ”wb.2” 18

(25)

load() による逆シリアル化

オブジェクトのもとの状態もきちんと保存される。

> # 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)

(26)

Rda フォーマットの短所

• 変数名がオブジェクトと⼀緒に保存される。 • 逆シリアル化の時、オブジェクトに新しい変数名を指定するこ とができない。 • load() 関数の場合、オブジェクトが⾃動的にもとの名前で復元 されるため、現在のワークスペースにあるデータを上書きする おそれがある。 20

(27)

Rda フォーマットの短所

> # wb に新しい値を付与する。 > wb <- c(’foo’, ’bar’) > # 中⾝を覗く。 > str(wb) chr [1:2] ”foo” ”bar”

(28)

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

...

(29)

⽅法

2: Rds

.

(30)

1 つのオブジェクトを 1 つのファイルに保存する

Rds フォーマットは⼀度に1つのオブジェクトのみを保存する。 逆シリアル化の時はオブジェクトに変数名を指定できる。 オブジェクトの保存と復元をより上⼿くコントロールできる。 拡張⼦として .rds がよく使われる。 23

(31)

1 つのオブジェクトを 1 つのファイルに保存する

Rds フォーマットは⼀度に1つのオブジェクトのみを保存する。 逆シリアル化の時はオブジェクトに変数名を指定できる。

オブジェクトの保存と復元をより上⼿くコントロールできる。 拡張⼦として .rds がよく使われる。

(32)

saveRDS() 関数によるシリアル化

⼀度に1つのオブジェクトのみを保存する。

> saveRDS(wb, ’wb.rds’)

> saveRDS(wb.2, ’wb.2.rds’)

(33)

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

(34)

readRDS() 関数による逆シリアル化

> # 指定した変数にオブジェクトを読み込む。 > wb.3 <- readRDS(’wb.2.rds’) > # wb.2 と wb.3 は完全に同じである。 > all.equal(wb.2, wb.3) [1] TRUE 26

(35)

⽅法

3: Feather

.

(36)

他の統計解析環境との互換性

Rda、Rds は R 専⽤ のフォーマットであり、 あらゆるタイプのR オブジェクトをシリアル化できる。 • ベクトル • ⾏列 • リスト • データフレーム • フィットしたモデル • 関数 • … 27

(37)

他の統計解析環境との互換性

表形式のデータフレームは、

統計解析における中⼼的なデータタイプ。

Feather フォーマットは、R と、Python の pandas パッケージの データフレームの互換 を実現する。

(38)

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” 29

(39)

Python で Feather を使う

>>> import feather >>> # Feather ファイルを読み込む。 >>> wb_2 = feather.read_dataframe(’wb.2.feather’) >>> # 最初の 6 ⾏を表⽰する。 >>> wb_2.head(6) breaks wool tension

0 26 A L

1 30 A L

2 54 A L

(40)

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)

(41)
(42)

ビッグ・ピクチャー

.

(43)

ビッグ・ピクチャー

1つのプロジェクトを機能別に複数のスクリプトに分ける。 シリアル化で重要なオブジェクトを保存し、後で再利⽤する。 • model.R データを読み込み、モデルをフィットする。 フィットしたモデルをシリアル化する。 • anlys.R モデルを逆シリアル化し、推定値を抽出し分析する。 分析の結果をデータフレームにまとめ、 シリアル化+CSV に保存する。 • graph.R

(44)

参考⽂献

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

(45)

参考⽂献

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

(46)

ありがとうございました

.

参照

関連したドキュメント

答 200dpi 以上の解像度及び赤・緑・青それぞれ 256 階調 (注) 以上で JIS X6933 又は ISO

共通点が多い 2 。そのようなことを考えあわせ ると、リードの因果論は結局、・ヒュームの因果

第 98 条の6及び第 98 条の7、第 114 条の 65 から第 114 条の 67 まで又は第 137 条の 63

Q-Flash Plus では、システムの電源が切れているとき(S5シャットダウン状態)に BIOS を更新する ことができます。最新の BIOS を USB

を受けている保税蔵置場の名称及び所在地を、同法第 61 条の5第1項の承

被保険者証等の記号及び番号を記載すること。 なお、記号と番号の間にスペース「・」又は「-」を挿入すること。

基準の電力は,原則として次のいずれかを基準として決定するも

能率競争の確保 競争者の競争単位としての存立の確保について︑述べる︒