#author("2019-02-24T23:34:37+00:00","","")
#author("2019-02-26T03:21:55+00:00","","")
* R言語入門 [#u119428d]
#setlinebreak(on);

#TODO(関数の利用とapply)

#contents
-- 参考
--- https://www.r-project.org
--- https://cran.r-project.org/manuals.html
--- https://www.rdocumentation.org/
-- 関連
--- [[機械学習の為の数学の基礎]]
--- [[ディープラーニング入門]]
--- [[TensorFlow入門]]
--- [[Keras入門]]
--- [[Chainer入門]]
--- [[PyTorch入門]]
--- [[pandas入門]]
--- [[numpy入門]]

** 概要 [#zeb574ac]
#html(<div style="padding-left: 10px;">)
R言語は、統計解析向けのプログラミング言語及びその開発実行環境。
#html(</div>)


** インストール [#j9fb2c66]
#html(<div style="padding-left: 10px;">)

以下の URLからインストーラをダウンロードしてインストール

| - | URL |h
| R | http://cran.r-project.org/mirrors.html |
| R Studio | https://www.rstudio.com/products/rstudio/download/ |

#html(</div>)

** 基本操作 [#ta44e21a]
#html(<div style="padding-left: 10px;">)

*** 開始と終了 [#r3acd067]
#html(<div style="padding-left: 10px;">)

Rがインストールされている環境で ''r'' を入力すれば、R がインタラクティブモードで起動する。
#myterm2(){{
r

R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
.
.
.
'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

> 
}}

終了は q()
#myterm2(){{
> q()
Save workspace image? [y/n/c]: n
}}
※ --save  または --no-save オプション付きで起動した場合は、終了時の確認メッセージは表示されない。

#html(</div>)

*** ヘルプの表示方法 [#la3c91f7]
#html(<div style="padding-left: 10px;">)
''?コマンド名''  でコマンドのヘルプを表示する事ができる。

例)
#myterm2(){{
> ?read.table
read.table                package:utils                R Documentation
    .
    .
Usage:

     read.table(file, header = FALSE, sep = "", quote = "\"'",
                dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
                row.names, col.names, as.is = !stringsAsFactors,
                na.strings = "NA", colClasses = NA, nrows = -1,
                skip = 0, check.names = TRUE, fill = !blank.lines.skip,
                strip.white = FALSE, blank.lines.skip = TRUE,
        .
        .
}}
#html(</div>)

*** 変数への代入 [#m73b1483]
#html(<div style="padding-left: 10px;">)

変数への代入は <- または -> で行う。
以下は、1&#12316;5までの連続した値のベクトルを生成し、x という変数に代入している。
#myterm2(){{
> x <- c(1:5)
> x
[1] 1 2 3 4 5
}}

複数の変数に代入する事も可能
#myterm2(){{
> x <- y <- 1:5
> x
[1] 1 2 3 4 5
> y
[1] 1 2 3 4 5
}}

左辺と右辺は入れ替える事も可能
#myterm2(){{
> 1:5 -> x -> y
> x
[1] 1 2 3 4 5
> y
[1] 1 2 3 4 5
}}

#html(</div>)

*** 連続した値の生成 [#k552614f]
#html(<div style="padding-left: 10px;">)

n:m と記述する事で連続した値を生成する事ができる。
#myterm2(){{
> 1:5
[1] 1 2 3 4 5
}}
#html(</div>)

#html(<div style="padding-left: 10px;">)

開始値, 終了値, 増分 を指定して値を生成する場合は seq を使用する。
#myterm2(){{
> seq(1, 5, 2)
[1] 1 3 5
}}
#html(</div>)

*** 繰り返し値の生成 [#me5a12bc]
#html(<div style="padding-left: 10px;">)

任意の値をN個分繰り返すには rep を使用する。
#myterm2(){{
> rep(1, 5)
[1] 1 1 1 1 1
}}

値には ベクトルを指定する事もできる。
#myterm2(){{
> rep(1:3, 5)
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
}}
#html(</div>)

*** 定義済みの変数一覧を表示する [#t7b5139f]
#html(<div style="padding-left: 10px;">)
定義した全ての変数の一覧を ls() で確認する事ができる。
#myterm2(){{
> x <- 1:10
> y <- 101:110
> ls()
[1] "x" "y"
}}
#html(</div>)

*** 使わない変数を消す [#f67c34fb]
#html(<div style="padding-left: 10px;">)

rm で定義した変数を削除する事ができる。
#myterm2(){{
> x <- 1:10
> y <- 101:110
> ls()
[1] "x" "y"
> rm(y)
> ls()
[1] "x"
}}

rm の 名前付き引数 list に変数名の一覧を指定して削除する事もできる。
※以下は、全ての変数を削除する例。
#myterm2(){{
> x <- 1:10
> y <- 101:110
> ls()
[1] "x" "y"
> rm(list=ls())
> ls()
character(0)
}}

#html(</div>)

*** 外部スクリプトの読み込み [#p6b86aab]
#html(<div style="padding-left: 10px;">)

別ファイルに保存したスクリプトを読み込むには source を使用する。

test.R
#mycode2(){{
x = c(1:5)
}}

実行例
#myterm2(){{
> source("test.R")
> x
[1] 1 2 3 4 5
}}
#html(</div>)

*** ワークスペースの保存 [#o6f8291a]
#html(<div style="padding-left: 10px;">)
Rでは作業中のワークスペースの状態をワークスペースに保存しておき、後から復元する事ができる。

変数 x, y, z を定義してRを終了(確認で y を入力)
#myterm2(){{
R
> x <- 1:10
> y <- 101:110
> z <- 201:210
> q()
Save workspace image? [y/n/c]: y
}}

再開
#myterm2(){{
R
 .
 .
 [以前にセーブされたワークスペースを復帰します] 
> ls()
[1] "x" "y" "z"
}}

R を  --save  または --no-save オプション付きで起動した場合は、Rの終了時に確認メッセージは表示されない。
※自動的に保存して(または保存しないで)終了する。

尚、変数 及び 履歴情報は作業ディレクトリ配下の .RData  及び .Rhistory というファイルに保存されている。
※これらのファイルを消せばワークスペースの状態を初期化できる。

#html(</div>)

*** コマンドラインから R のスクリプトを実行する [#u220a3d9]
#html(<div style="padding-left: 10px;">)

test.R
#mycode2(){{
x <- 1:10
cat(x)
}}

実行
#myterm2(){{
rscript test.R
1 2 3 4 5 6 7 8 9 10
}}
#html(</div>)

#html(</div>)

** オブジェクト内容の表示 [#b1c04a1d]
#html(<div style="padding-left: 10px;">)

*** 変数名のタイプによる表示 [#c23ac758]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
}}
#html(</div>)

*** print による表示 [#fdcb4fe4]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
> x <- 1:10
> print(x)
 [1]  1  2  3  4  5  6  7  8  9 10
}}
#html(</div>)

*** sprintf [#qb6b4fb5]
#html(<div style="padding-left: 10px;">)

書式付きでオブジェクトを表示する場合には sprint を使用する。
#myterm2(){{
> sprintf("%3.2f", 123.456)
[1] "123.46"
}}
#html(</div>)

*** cat [#ca84f6b4]
#html(<div style="padding-left: 10px;">)
cat を使用すれば文字列をダブルクォーテーションなしで表示できる。
#myterm2(){{
> str1 = "ABCDEFG"
> cat(str1)
ABCDEFG
}}
#html(</div>)

*** str [#k06035be]
#html(<div style="padding-left: 10px;">)
str を使用すると、オブジェクトの内容をデータ型などの情報付きで表示できる。
#myterm2(){{
> str1 = "123"
> str(str1)
 chr "123"
}}
#html(</div>)

#html(</div>)

** 処理制御 [#ta308837]

*** 条件分岐 [#ma266456]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
> x = 10
> if (x > 5) {
+   print("x > 5")
+   print(x)
+ } else {
+   print("x <= 5")
+   print(x)
+ }
[1] "x > 5"
[1] 10
}}
#html(</div>)

*** forループ [#ve614fbe]
#html(<div style="padding-left: 10px;">)
繰り返し処理には for文が使用できる。
&color(red){ただし R の for文は遅いので処理を関数化して apply系で記述する方が高速に動作する。};
#myterm2(){{
> for (i in 1:5) {
+   print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
}}
#html(</div>)

*** whileループ [#ve614fbe]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

*** switch文 [#v44928aa]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

#html(</div>)


** ファイル入出力 [#zf6c6aea]
#html(<div style="padding-left: 10px;">)

以降の例で使用する csv ファイルは以下の通りとする。

browser-JP.csv   ( http://gs.statcounter.com/browser-market-share/all/japan より )
#mycode2(){{
"Date","Chrome","Safari","IE","Firefox","Edge","Android"
2018-06,41.96,31.83,11.5,6.63,4.29,0.97
2018-07,41.9,32.29,11.13,6.43,4.26,0.9
2018-08,42.54,31.91,11.15,6.44,4.23,0.9
2018-09,41.18,34.45,10.43,6.14,4.36,0.78
2018-10,43.11,33.01,10.2,6.2,4.23,0.69
2018-11,44.28,32.54,9.49,6.31,4.14,0.69
2018-12,44.47,31.96,9.21,6.81,4,0.74
}}

*** 単純なファイルの入出力 [#he11ad56]
#html(<div style="padding-left: 10px;">)
#TODO
file
write
writeLine
#html(</div>)

*** CSVファイルの入出力 [#n75dfefe]
#html(<div style="padding-left: 10px;">)

read.table で CSVファイルからデータフレームを生成できる。
#myterm2(){{
> read.table("browser-JP.csv", sep=",", header=T, row.names="Date")
        Chrome Safari    IE Firefox Edge Android
2018-06  41.96  31.83 11.50    6.63 4.29    0.97
2018-07  41.90  32.29 11.13    6.43 4.26    0.90
2018-08  42.54  31.91 11.15    6.44 4.23    0.90
2018-09  41.18  34.45 10.43    6.14 4.36    0.78
2018-10  43.11  33.01 10.20    6.20 4.23    0.69
2018-11  44.28  32.54  9.49    6.31 4.14    0.69
2018-12  44.47  31.96  9.21    6.81 4.00    0.74
}}
※sep="," で 列の区切り文字を指定している。
※header=T で1行目は列名である事を示している。
※row.names で行ラベルに使用する列名を指定している。(上記では "Date" 列のデータを行ラベルとして扱う旨を示している)
※詳細は ?read.table で確認。

write.table でデータフレームをCSVファイルに出力できる。
#myterm2(){{
> write.table(x, "output.csv", quote=F, col.names=T, row.names=T, sep=",")
}}
※詳細は ?write.table で確認。

#html(</div>)

*** Excelへのデータ出力 [#r12e1735]
#html(<div style="padding-left: 10px;">)
#TODO
write.xlsx()
write.xlsx2()
#html(</div>)

*** オブジェクトの保存と読み込み [#h34ae862]
#html(<div style="padding-left: 10px;">)
R ではオブジェクトそのものをファイルに保存したり、ファイルから復元する事ができる。

ベクトル x をファイルに保存)
#myterm2(){{
> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> save(x, file="x.rdata")
}}

いちど変数を削除後にファイルから x を読み込む)
#myterm2(){{
> rm(x)
> x
 エラー:  オブジェクト 'x' がありません 
> load("x.rdata")
> x
 [1]  1  2  3  4  5  6  7  8  9 10
}}

#html(</div>)

#html(</div>)


** 文字列の操作 [#pf712062]
#html(<div style="padding-left: 10px;">)

*** 文字列の結合 [#rd674a09]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
> paste("abc", "def", sep="")
[1] "abcdef"
}}
#html(</div>)
#html(</div>)

** ベクトルの操作 [#be7e9df4]
#html(<div style="padding-left: 10px;">)

*** ベクトルの生成 [#i3c3ce12]
#html(<div style="padding-left: 10px;">)

c() でベクトルの生成を行う事ができる。
#myterm2(){{
> x <- c(100,200,300)
> x
[1] 100 200 300
}}

連続した値のベクトルであれば n:m でも生成可能。
#myterm2(){{
> x <- 1:5
> x
[1] 1 2 3 4 5
}}

他にファイルからデータを読み込んでデータフレームを生成する事も可能。( [[CSVファイルの入出力>#n75dfefe]] を参照 )

#html(</div>)

*** ベクトルの要素へのアクセス [#b04cf1cb]
#html(<div style="padding-left: 10px;">)
要素番号を指定して特定の要素にアクセスする事ができる。
#myterm2(){{
> x <- 10:20
> x
 [1] 10 11 12 13 14 15 16 17 18 19 20
> x[2] <- 99
> x
 [1] 10 99 12 13 14 15 16 17 18 19 20
}}
#html(</div>)

*** ベクトルの特定の値を書き換える [#bb4d9404]
#html(<div style="padding-left: 10px;">)
要素番号を指定して特定の要素にアクセスする事ができる。
#myterm2(){{
> x <- 10:20
> x
 [1] 10 11 12 13 14 15 16 17 18 19 20
> x[x == 15] <- 999
> x
 [1]  10  11  12  13  14 999  16  17  18  19  20
}}

上記を分けて書くと以下のようになる。
※真偽値リストを条件に指定して真である要素を書き換えている。(pandasのデータフレーム等と同じやり方)
#myterm2(){{
> x <- 10:20
> x
 [1] 10 11 12 13 14 15 16 17 18 19 20
> condition <- x == 15
> condition
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
> x[condition] <- 999
> x
 [1]  10  11  12  13  14 999  16  17  18  19  20
}}
#html(</div>)

*** ベクトルの結合 [#mec11780]
#html(<div style="padding-left: 10px;">)
c() でベクトルを結合した別のベクトルを得る事ができる。
※c() の引数に指定したベクトル自体の内容は変わらない。
#myterm2(){{
> x <- 1:10
> y <- 11:20
> z <- c(x, y)
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> y
 [1] 11 12 13 14 15 16 17 18 19 20
> z
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
}}
#html(</div>)

*** ベクトルの要素の追加 [#z40b1a27]
#html(<div style="padding-left: 10px;">)
append を使用するとベクトルに要素を追加した別のベクトルを得る事ができる。
※append の引数に指定したベクトル自体の内容は変わらない。
#myterm2(){{
> x <- 1:10
> y <- append(x, 101:105)
> x
 [1]  1  2  3  4  5  6  7  8  9 10     # x 自体の内容は変わらない
> y
 [1]   1   2   3   4   5   6   7   8   9  10 101 102 103 104 105
}}
#html(</div>)

#html(</div>)

** 行列の操作 [#g160ba11]
#html(<div style="padding-left: 10px;">)

*** 行列の生成 [#b6f7ca99]
matrix で行列を生成する事ができる。

#myterm2(){{
> matrix(1:9, nrow=3, ncol=3)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> matrix(1:9, nrow=3, ncol=3, byrow=T)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
}}
#html(</div>)

*** 行列の入れ替え [#l88f133f]
#html(<div style="padding-left: 10px;">)
t() で行列を入れ替える事ができる。
#myterm2(){{
> x <- matrix(1:9, nrow=3, ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> t(x)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
}}
#html(</div>)


*** 行列の要素へのアクセス [#s16ce8c5]
#html(<div style="padding-left: 10px;">)

行列の各要素へは [行No, 列No] でアクセス可能。
#myterm2(){{
> x <- matrix(1:9, nrow=3, ncol=3, byrow=T)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> x[2,2]
[1] 5
> x[2,2] <- 10
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4   10    6
[3,]    7    8    9
}}

以下のように、特定の値を変更する事も可能。
#myterm2(){{
> x <- matrix(1:9, nrow=3, ncol=3, byrow=T)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> x[x == 1 | x == 8] <- 999
> x
     [,1] [,2] [,3]
[1,]  999    2    3
[2,]    4    5    6
[3,]    7  999    9
}}

以下の例では偶数値を "even!" に書き換えている。
#myterm2(){{
> x <- matrix(1:9, nrow=3, ncol=3, byrow=T)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> x[x %% 2 == 0] <- "even!"
> x
     [,1]    [,2]    [,3]   
[1,] "1"     "even!" "3"    
[2,] "even!" "5"     "even!"
[3,] "7"     "even!" "9"   
}}

[[pandasのデータフレームと同じ様に>pandas入門]] Bool値のリストを作って真となるの要素を書き換える事も可能。
#myterm2(){{
> x <- matrix(1:9, nrow=3, ncol=3, byrow=T)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> x[x %% 2 == 0 -> even]
[1] 4 2 8 6
> even
      [,1]  [,2]  [,3]
[1,] FALSE  TRUE FALSE
[2,]  TRUE FALSE  TRUE
[3,] FALSE  TRUE FALSE
> x[even] <- "even!"
> x
     [,1]    [,2]    [,3]   
[1,] "1"     "even!" "3"    
[2,] "even!" "5"     "even!"
[3,] "7"     "even!" "9"
}}
#html(</div>)

*** 行列の結合 [#z1e96e61]
#html(<div style="padding-left: 10px;">)
rbind または cbind で行列を結合する事ができる。
※rbindは縦に行を結合、cbind は横に列を結合。

#myterm2(){{
> x = matrix(1:9,ncol = 3, nrow =3)
> y = matrix(11:13, ncol = 3, nrow =1)
> z = matrix(21:23, ncol = 1, nrow =3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> y
     [,1] [,2] [,3]
[1,]   11   12   13
> z
     [,1]
[1,]   21
[2,]   22
[3,]   23
> rbind(x, y)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
[4,]   11   12   13
> cbind(x, z)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   21
[2,]    2    5    8   22
[3,]    3    6    9   23
}}
#html(</div>)

*** 行列の演算 [#d098f734]
#html(<div style="padding-left: 10px;">)

行列の和、差
#myterm2(){{
> x <- matrix(1:4, 2, 2, byrow=T)
> x
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> y <- matrix(1:4, 2, 2, byrow=T)
> y
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> x + y    # 行列の和
     [,1] [,2]
[1,]    2    4
[2,]    6    8
> x - y    # 行列の差
     [,1] [,2]
[1,]    0    0
[2,]    0    0
}}

行列の積
#myterm2(){{
> x <- matrix(1:6, 2, 3, byrow=T)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> y <- matrix(1:6, 3, 2, byrow=T)
> y
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
> x %*% y           # 行列積は %*% で行う(  x * y だと要素毎の乗算になってしまう )
     [,1] [,2]
[1,]   22   28
[2,]   49   64
}}
※ [[numpyでの演算結果>numpy入門#vd9870ad]] とも一致する。

#html(</div>)


#html(</div>)

** リストの操作 [#e0f640a6]
#html(<div style="padding-left: 10px;">)

ベクトルや行列などの異なる構造のデータを集めて 1 個のオブジェクトに纏める場合にはリストを使用する。

*** リストの生成 [#uae6f52c]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
> x <- 1:10
> y <- 101:110
> list(x, y)
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1] 101 102 103 104 105 106 107 108 109 110
}}
#html(</div>)

*** リストの要素へのアクセス [#vfe27bbe]
#html(<div style="padding-left: 10px;">)
リストの要素には [要素番号] または [[要素番号]] でアクセスする事ができる。
[要素番号] でアクセスした場合の戻り値はリスト、[[要素番号]]でアクセスした場合の戻り値は要素の内容そのものとなる。
#myterm2(){{
> l = list(1,2,3)
> l[1]
[[1]]
[1] 1

> l[[1]]
[1] 1
}}

#html(</div>)

#html(</div>)

** データフレームの操作 [#wb69ca70]
#html(<div style="padding-left: 10px;">)
データフレームを使用すると異なる型のデータをまとめて1 つの変数として持つ事ができる。
単純な行列と違い、各行/列はラベルを持ち、ラベル指定による操作が可能。
列のデータ型が異なっていても扱える為、ベクトルやリストをデータフレームに変換することで統計解析がやりやすくなる。

*** データフレームの生成 [#z0b8967f]
#html(<div style="padding-left: 10px;">)

データフレームは data.frame(列名=ベクトル, 列名=ベクトル, ... ) の形式で生成する。
#myterm2(){{
> # 行ラベル
> dates   <- c("2018-06","2018-07","2018-08","2018-09","2018-10","2018-11","2018-12")
> 
> # 以下列データ
> chrome  <- c(41.96, 41.9, 42.54, 41.18, 43.11, 44.28, 44.47)
> safari  <- c(31.83, 32.29, 31.91, 34.45, 33.01, 32.54, 31.96)
> ie      <- c(11.5, 11.13, 11.15, 10.43, 10.2, 9.49, 9.21)
> firefox <- c(6.63, 6.43, 6.44, 6.14, 6.2, 6.31, 6.81)
> edge    <- c(4.29, 4.26, 4.23, 4.36, 4.23, 4.14, 4.0)
> 
> # データフレームの生成
> x = data.frame(Chrome=chrome, Safari=safari, IE=ie, Firefox=firefox, Edge=edge)
>
> # 行ラベルを付与
> rownames(x) <- dates
> x
        Chrome Safari    IE Firefox Edge
2018-06  41.96  31.83 11.50    6.63 4.29
2018-07  41.90  32.29 11.13    6.43 4.26
2018-08  42.54  31.91 11.15    6.44 4.23
2018-09  41.18  34.45 10.43    6.14 4.36
2018-10  43.11  33.01 10.20    6.20 4.23
2018-11  44.28  32.54  9.49    6.31 4.14
2018-12  44.47  31.96  9.21    6.81 4.00
}}
#html(</div>)

*** summary による列情報の概要表示 [#q6ed95de]
#html(<div style="padding-left: 10px;">)

summary で列毎の概要を表示する事ができる。
#myterm2(){{
> summary(x)
     Chrome          Safari            IE            Firefox     
 Min.   :41.18   Min.   :31.83   Min.   : 9.210   Min.   :6.140  
 1st Qu.:41.93   1st Qu.:31.93   1st Qu.: 9.845   1st Qu.:6.255  
 Median :42.54   Median :32.29   Median :10.430   Median :6.430  
 Mean   :42.78   Mean   :32.57   Mean   :10.444   Mean   :6.423  
 3rd Qu.:43.70   3rd Qu.:32.77   3rd Qu.:11.140   3rd Qu.:6.535  
 Max.   :44.47   Max.   :34.45   Max.   :11.500   Max.   :6.810  
      Edge      
 Min.   :4.000  
 1st Qu.:4.185  
 Median :4.230  
 Mean   :4.216  
 3rd Qu.:4.275  
 Max.   :4.360
}}
#html(</div>)

*** データフレームを行列に変換する [#t3ecd062]
#html(<div style="padding-left: 10px;">)

as.matrix による変換
#myterm2(){{
> as.matrix(x)
        Chrome Safari    IE Firefox Edge
2018-06  41.96  31.83 11.50    6.63 4.29
2018-07  41.90  32.29 11.13    6.43 4.26
2018-08  42.54  31.91 11.15    6.44 4.23
2018-09  41.18  34.45 10.43    6.14 4.36
2018-10  43.11  33.01 10.20    6.20 4.23
2018-11  44.28  32.54  9.49    6.31 4.14
2018-12  44.47  31.96  9.21    6.81 4.00
}}

さらに matrix を噛ましてラベルを落とす
#myterm2(){{
> matrix(as.matrix(x), nrow(x), ncol(x))
      [,1]  [,2]  [,3] [,4] [,5]
[1,] 41.96 31.83 11.50 6.63 4.29
[2,] 41.90 32.29 11.13 6.43 4.26
[3,] 42.54 31.91 11.15 6.44 4.23
[4,] 41.18 34.45 10.43 6.14 4.36
[5,] 43.11 33.01 10.20 6.20 4.23
[6,] 44.28 32.54  9.49 6.31 4.14
[7,] 44.47 31.96  9.21 6.81 4.00
}}

colnames、rownames に NULL を設定して名前を落とす
#myterm2(){{
> y <- as.matrix(x)
> y
        Chrome Safari    IE Firefox Edge
2018-06  41.96  31.83 11.50    6.63 4.29
2018-07  41.90  32.29 11.13    6.43 4.26
2018-08  42.54  31.91 11.15    6.44 4.23
2018-09  41.18  34.45 10.43    6.14 4.36
2018-10  43.11  33.01 10.20    6.20 4.23
2018-11  44.28  32.54  9.49    6.31 4.14
2018-12  44.47  31.96  9.21    6.81 4.00
> colnames(y) <- NULL
> rownames(y) <- NULL
> y
      [,1]  [,2]  [,3] [,4] [,5]
[1,] 41.96 31.83 11.50 6.63 4.29
[2,] 41.90 32.29 11.13 6.43 4.26
[3,] 42.54 31.91 11.15 6.44 4.23
[4,] 41.18 34.45 10.43 6.14 4.36
[5,] 43.11 33.01 10.20 6.20 4.23
[6,] 44.28 32.54  9.49 6.31 4.14
[7,] 44.47 31.96  9.21 6.81 4.00
}}
#html(</div>)

*** データフレームに列を追加する [#x4f45b22]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

*** データフレームに行を追加する [#t926b8ae]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

*** データフレームで使用できる分析関数 [#u2526395]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

#html(</div>)

** ファイル操作 [#zf6c6aea]
#html(<div style="padding-left: 10px;">)

sample.txt
#mycode2(){{
}}

sample.txt
#mycode2(){{
}}

*** writeによるファイル出力 [#s246fae2]
#html(<div style="padding-left: 10px;">)

以下、行列をファイルに出力する例を記載する。
#myterm2(){{
> x <- matrix(1:10, ncol=2)
> x
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
> write(x, file="data_matrix.txt", ncolumns=2)
}}

結果は転置されて出力される。

(結果)
#mycode2(){{
1 2
3 4
5 6
7 8
9 10
}}

転置せずに出力する場合は、事前に t で転置してから出力する。
#myterm2(){{
> write(t(x), file="data_matrix.txt", ncolumns=2)
}}

(結果)
#mycode2(){{
1 6
2 7
3 8
4 9
5 10
}}

#html(</div>)

*** scan によるファイル読み込み [#ncf54da7]
#html(<div style="padding-left: 10px;">)

scan でファイルのデータをベクトルとして読み込む事ができる。
#myterm2(){{
> x <- matrix(1:10, ncol=5, byrow=T)
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
> write(x, "test_matrix.txt")
> y <- scan("test_matrix.txt")
Read 10 items
> y
 [1]  1  6  2  7  3  8  4  9  5 10
}}


結果はベクトルになるので行列に変換する場合は matrix で自分で変換する。
#myterm2(){{
> matrix(y, ncol=5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
}}

データ型が混在する場合はデータ型を明示しないとエラーになる。( what に列毎の変換関数のリストを指定する )
#myterm2(){{
x = data.frame(Name=c("Yamada", "Tanaka"), Age=c(20, 22), Sex=c("M","W"))
write.table(x, "output.csv", quote=F, col.names=T, row.names=F, sep=",")
system("cat output.csv")
> system("cat output.csv")
Name,Age,Sex
Yamada,20,M
Tanaka,22,W
> scan("output.csv", skip=1, sep=",")
 scan("output.csv", skip = 1, sep = ",") でエラー: 
   scan() 関数は 'a real' を期待したのに、得られたのは 'Yamada' でした 
> scan("output.csv", what=list("",numeric(),""), skip=1, sep=",")
Read 2 records
[[1]]
[1] "Yamada" "Tanaka"

[[2]]
[1] 20 22

[[3]]
[1] "M" "W"
}}

#html(</div>)

*** readLines によるテキストファイルの読み込み [#q69eab16]
#html(<div style="padding-left: 10px;">)

readLines を使用すると1行=1要素としたベクトルを得る事ができる。

sample.txt
#mycode2(){{
This is  first  Line.
Hello R!
}}

読み込み例
#myterm2(){{
> x =  readLines('sample.txt')
> x
[1] "This is  first  Line." "Hello R!"             
> x[1]
[1] "This is  first  Line."
> x[2]
[1] "Hello R!"
}}

#html(</div>)

*** csvファイルの入出力 [#n75dfefe]
#html(<div style="padding-left: 10px;">)

read.table で csvファイルからデータフレームを生成できる。

browser-JP.csv   ( http://gs.statcounter.com/browser-market-share/all/japan より )
#mycode2(){{
"Date","Chrome","Safari","IE","Firefox","Edge","Android"
2018-06,41.96,31.83,11.5,6.63,4.29,0.97
2018-07,41.9,32.29,11.13,6.43,4.26,0.9
2018-08,42.54,31.91,11.15,6.44,4.23,0.9
2018-09,41.18,34.45,10.43,6.14,4.36,0.78
2018-10,43.11,33.01,10.2,6.2,4.23,0.69
2018-11,44.28,32.54,9.49,6.31,4.14,0.69
2018-12,44.47,31.96,9.21,6.81,4,0.74
}}

#myterm2(){{
> read.table("browser-JP.csv", sep=",", header=T, row.names="Date")
        Chrome Safari    IE Firefox Edge Android
2018-06  41.96  31.83 11.50    6.63 4.29    0.97
2018-07  41.90  32.29 11.13    6.43 4.26    0.90
2018-08  42.54  31.91 11.15    6.44 4.23    0.90
2018-09  41.18  34.45 10.43    6.14 4.36    0.78
2018-10  43.11  33.01 10.20    6.20 4.23    0.69
2018-11  44.28  32.54  9.49    6.31 4.14    0.69
2018-12  44.47  31.96  9.21    6.81 4.00    0.74
}}
※sep="," で 列の区切り文字を指定している。
※header=T で1行目は列名である事を示している。
※row.names で行ラベルに使用する列名を指定している。(上記では "Date" 列のデータを行ラベルとして扱う旨を示している)
※詳細は ?read.table で確認。

write.table でデータフレームをCSVファイルに出力できる。
#myterm2(){{
> write.table(x, "output.csv", quote=F, col.names=T, row.names=T, sep=",")
}}
※詳細は ?write.table で確認。

#html(</div>)

*** Excelへのデータ出力 [#r12e1735]
#html(<div style="padding-left: 10px;">)

インストール
#myterm2(){{
install.packages("xlsx")
install.packages('rJava')
}}

手元のMacではインストール時に以下のエラーを吐いてコケる。
#myterm2(){{
 警告メッセージ: 
 doTryCatch(return(expr), name, parentenv, handler) で: 
   共有ライブラリ '/Library/Frameworks/R.framework/Resources/modules//R_X11.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libcairo.2.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/modules//R_X11.so
  Reason: Incompatible library version: R_X11.so requires version 11403.0.0 or later, but libcairo.2.dylib provides version 11203.0.0 
}}

R_X11.so のバージョンが古いらしいので https://github.com/satijalab/seurat/issues/299 を参考に、以下の通り対応。
#myterm2(){{
brew cask install xquartz
}}

実際に使おうとすると、今度は以下のエラーになる。
#myterm2(){{
> library(xlsx)
 エラー: package or namespace load failed for ‘xlsx’:
  .onLoad は loadNamespace()('rJava' に対する)の中で失敗しました、詳細は: 
  call: dyn.load(file, DLLpath = DLLpath, ...) 
  error:  共有ライブラリ '/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
  Reason: image not found  
}}

どうもインストールされていないJDKのバージョンのものを探してる模様。
解決方法を調べてみると  dyn.load("/path/to/libjvm.dylib") で libjvm.dylib の場所を指定する方法や /usr/local/lib/ にシンボリックリンクを貼る方法等が見つかったが、
ここでは素直に jdk11 をインストールした。( Java11から商用利用は有償になるので correto とかの方が良いかも )
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

#myterm2(){{
library(xlsx)
x = read.table("browser-JP.csv", sep=",", header=T, row.names="Date")
write.xlsx(x, "output.xlsx", sheetName="Sheet1", col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE, password=NULL)
}}
※ https://www.rdocumentation.org/packages/xlsx/versions/0.6.1/topics/write.xlsx

#html(</div>)

*** オブジェクトの保存と読み込み [#h34ae862]
#html(<div style="padding-left: 10px;">)
R ではオブジェクトそのものをファイルに保存したり、ファイルから復元する事ができる。

ベクトル x をファイルに保存)
#myterm2(){{
> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> save(x, file="x.rdata")
}}

いちど変数を削除後にファイルから x を読み込む)
#myterm2(){{
> rm(x)
> x
 エラー:  オブジェクト 'x' がありません 
> load("x.rdata")
> x
 [1]  1  2  3  4  5  6  7  8  9 10
}}

#html(</div>)

#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS