#author("2019-02-22T05:01:27+00:00","","") * R言語 [#zb0c5a03] #setlinebreak(on); #contents -- 参考 --- 公式サイト - https://www.r-project.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>) ** 変数への代入 [#m73b1483] #html(<div style="padding-left: 10px;">) 変数への代入は <- または -> で行う。 以下は、1〜5までの連続した値のベクトルを生成し、x という変数に代入している。 #myterm2(){{ > x <- c(1:5) > x [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 }} 左辺と右辺は入れ替える事も可能 #myterm2(){{ > x <- y <- 1:5 > 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>) ** ベクトルの生成 [#l89aab77] #html(<div style="padding-left: 10px;">) ベクトルの生成は c() で行う。 #myterm2(){{ > x <- c(100,200,300) > x [1] 100 200 300 }} #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>) ** オブジェクトの出力 [#b1c04a1d] #html(<div style="padding-left: 10px;">) *** print [#ne4baeb7] #html(<div style="padding-left: 10px;">) #myterm2(){{ > x <- 1:5 > print(x) [1] 1 2 3 4 5 }} #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>) ** ファイル入出力 [#zf6c6aea] #html(<div style="padding-left: 10px;">) *** 基本的なデータ入出力 [#he11ad56] #html(<div style="padding-left: 10px;">) file write writeLine #html(</div>) *** CSVファイルの入出力 [#n75dfefe] #html(<div style="padding-left: 10px;">) #TODO write.csv #html(</div>) *** データフレームの入出力 [#be52291a] #html(<div style="padding-left: 10px;">) #TODO read.table write.table #html(</div>) *** Excelへのデータ出力 [#r12e1735] #html(<div style="padding-left: 10px;">) #TODO write.xlsx() write.xlsx2() #html(</div>) #html(</div>) ** 条件分岐 [#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>) ** 繰り返し [#b392c670] #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>) ** 文字列の操作 [#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 }} #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() でベクトルを結合する事ができる。 #myterm2(){{ > x <- 1:10 > y <- 11:20 > x [1] 1 2 3 4 5 6 7 8 9 10 > y [1] 11 12 13 14 15 16 17 18 19 20 > c(x, y) [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 でベクトルに要素を追加する事ができる。 #myterm2(){{ > x <- 1:10 > append(x, 101:105) [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>) *** 行列の要素へのアクセス [#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>) #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 つの変数として持つ事ができる。 単純な行列と違い、各行/列はラベルを持ち、ラベル指定による操作が可能。 列のデータ型が異なっていても扱える為、ベクトルやリストをデータフレームに変換することで統計解析がやりやすくなる。 *** データフレームの生成 [#cbd6ee33] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) *** データフレームの生成 [#z0b8967f] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) #html(</div>) ** その他の関数 [#n077d4df] #html(<div style="padding-left: 10px;">) | 関数名 | 説明 | | scan | | | save | | | load | | | rm | | | as.character | | | as.integer | | #html(</div>)