#author("2019-02-27T08:05:06+00:00","","") * R言語入門 [#u119428d] #setlinebreak(on); #contents -- 参考 --- https://www.r-project.org --- https://cran.r-project.org/manuals.html --- https://www.rdocumentation.org/ -- 関連 --- [[Rでグラフ描画]] --- [[機械学習の為の数学の基礎]] --- [[ディープラーニング入門]] --- [[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〜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>) *** 関数の定義 [#q766e917] #html(<div style="padding-left: 10px;">) 関数名 <- function(引数,...) で関数を定義する事ができる。 #myterm2(){{ > myfunc <- function(x) { + return (x**2) + } > > myfunc(2) [1] 4 > myfunc(10) [1] 100 }} #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>) *** 文字列の分割 [#je49b9b0] #html(<div style="padding-left: 10px;">) strsplit で文字列を分割する事ができる。 ※ただし結果はリストオブジェクトなので、unlist 等でベクトルに変換する等の処置が必要。 #myterm2(){{ > text <- "abc,def,ghi" > res <- strsplit(text, ",") > res [[1]] [1] "abc" "def" "ghi" > res[[1]] [1] "abc" "def" "ghi" > res[[1]][1] [1] "abc" > unlist(res)[1] [1] "abc" }} #html(</div>) *** 文字列の切り出し [#gd7d8bb8] #html(<div style="padding-left: 10px;">) substr で文字列を部分的に切り出す事が可能。 #myterm2(){{ > substr("1234567890", 2, 3) [1] "23" > substr(c("1234567890", "abcdefghijklmn"), 2, 3) [1] "23" "bc" }} #html(</div>) *** 文字列の置換 [#sfbf46e1] #html(<div style="padding-left: 10px;">) sub または gsub で文字列の置換を行う事ができる。 引数には文字列 以外にベクトルや行列も指定可能。(各要素に対して置換が行われる) #myterm2(){{ > sub("l", "L", c("Hello R!", "Hello Python!")) # マッチする最初の1文字を置換 [1] "HeLlo R!" "HeLlo Python!" > gsub("l", "L", c("Hello R!", "Hello Python!")) # マッチする全ての文字を置換 [1] "HeLLo R!" "HeLLo Python!" > gsub("[^a-zA-Z ]", "#", c("Hello R!", "Hello Python!")) # 正規表現で置換 [1] "Hello R#" "Hello Python#" }} #html(</div>) *** 文字列の長さを調べる [#cb136781] #html(<div style="padding-left: 10px;">) nchar #myterm2(){{ > length("abc") # lengthでは正しい長さは得られない [1] 1 > nchar("abc") # nchar だと正しい長さが得られる [1] 3 }} #html(</div>) *** 文字列の大文字/小文字を変換する [#q7813019] #html(<div style="padding-left: 10px;">) 大文字に変換 #myterm2(){{ > toupper("abc") [1] "ABC" > toupper(c("abc", "def")) [1] "ABC" "DEF" }} 小文字に変換 #myterm2(){{ > tolower("ABC") [1] "abc" > tolower(c("ABC", "DEF")) [1] "abc" "def" }} #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>) *** データフレームの列にアクセスする [#i59b6143] #html(<div style="padding-left: 10px;">) ''変数名$列名'' とする事でデータフレームの特定の列にアクセスできる。 #myterm2(){{ > df = read.table("browser-JP.csv", sep=",", header=T, row.names="Date") > df 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 > df$Chrome [1] 41.96 41.90 42.54 41.18 43.11 44.28 44.47 }} #html(</div>) *** データフレームに列を追加する [#x4f45b22] #html(<div style="padding-left: 10px;">) 元のデータフレームの内容を書き換える場合は ''変数名$列名 <- ベクトル' で追加する。 #myterm2(){{ > df = read.table("browser-JP.csv", sep=",", header=T, row.names="Date") > df$Desc <- rownames(df) > df Chrome Safari IE Firefox Edge Android Desc 2018-06 41.96 31.83 11.50 6.63 4.29 0.97 2018-06 2018-07 41.90 32.29 11.13 6.43 4.26 0.90 2018-07 2018-08 42.54 31.91 11.15 6.44 4.23 0.90 2018-08 2018-09 41.18 34.45 10.43 6.14 4.36 0.78 2018-09 2018-10 43.11 33.01 10.20 6.20 4.23 0.69 2018-10 2018-11 44.28 32.54 9.49 6.31 4.14 0.69 2018-11 2018-12 44.47 31.96 9.21 6.81 4.00 0.74 2018-12 }} transform を使用するとデータフレームに新たな列を追加した別のデータフレームを得る事ができる。 ※元のデータフレームの内容は変わらない。 #myterm2(){{ > df = read.table("browser-JP.csv", sep=",", header=T, row.names="Date") > df 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 > desc = rownames(df) > desc [1] "2018-06" "2018-07" "2018-08" "2018-09" "2018-10" "2018-11" "2018-12" > df2 = transform(df, Desc=desc) > df2 Chrome Safari IE Firefox Edge Android Desc 2018-06 41.96 31.83 11.50 6.63 4.29 0.97 2018-06 2018-07 41.90 32.29 11.13 6.43 4.26 0.90 2018-07 2018-08 42.54 31.91 11.15 6.44 4.23 0.90 2018-08 2018-09 41.18 34.45 10.43 6.14 4.36 0.78 2018-09 2018-10 43.11 33.01 10.20 6.20 4.23 0.69 2018-10 2018-11 44.28 32.54 9.49 6.31 4.14 0.69 2018-11 2018-12 44.47 31.96 9.21 6.81 4.00 0.74 2018-12 }} #html(</div>) *** データフレームに行を追加する [#t926b8ae] #html(<div style="padding-left: 10px;">) ''変数名[行ラベル名,] <- データ'' で行データを追加できる。 #myterm2(){{ > df = read.table("browser-JP.csv", sep=",", header=T, row.names="Date") > df 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 > df["2019-01",] <- c(42.9, 33.84, 9.45, 6.01, 4.16, 0.7) > df 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 2019-01 42.90 33.84 9.45 6.01 4.16 0.70 }} ラベル名が不要(もしくは連番) の場合は、''変数名[nrow(変数名)+1,] <- データ'' でOK。 #myterm2(){{ > df = read.table("browser-JP.csv", sep=",", header=T, row.names="Date") > rownames(df) <- NULL # 行ラベルを落とす > df Chrome Safari IE Firefox Edge Android 1 41.96 31.83 11.50 6.63 4.29 0.97 2 41.90 32.29 11.13 6.43 4.26 0.90 3 42.54 31.91 11.15 6.44 4.23 0.90 4 41.18 34.45 10.43 6.14 4.36 0.78 5 43.11 33.01 10.20 6.20 4.23 0.69 6 44.28 32.54 9.49 6.31 4.14 0.69 7 44.47 31.96 9.21 6.81 4.00 0.74 > df[nrow(df)+1,] <- c(42.9, 33.84, 9.45, 6.01, 4.16, 0.7) > df Chrome Safari IE Firefox Edge Android 1 41.96 31.83 11.50 6.63 4.29 0.97 2 41.90 32.29 11.13 6.43 4.26 0.90 3 42.54 31.91 11.15 6.44 4.23 0.90 4 41.18 34.45 10.43 6.14 4.36 0.78 5 43.11 33.01 10.20 6.20 4.23 0.69 6 44.28 32.54 9.49 6.31 4.14 0.69 7 44.47 31.96 9.21 6.81 4.00 0.74 8 42.90 33.84 9.45 6.01 4.16 0.70 }} #html(</div>) *** データフレームで使用できる分析関数 [#u2526395] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) #html(</div>) ** ファイル操作 [#zf6c6aea] #html(<div style="padding-left: 10px;">) *** 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>) *** writeLines によるテキストファイル出力 [#rf4f87b9] #html(<div style="padding-left: 10px;">) writeLines でテキストデータをファイルに出力する事ができる。 #myterm2(){{ > con = file("sample.txt", open="w") > writeLines("This is Sample!", con) > writeLines("Hello R!!", con) > writeLines("This is 3rd Line.", con) > close(con) > > system("cat sample.txt") This is Sample! Hello R!! This is 3rd Line. }} cat に file オプションと sep オプションを指定しても同じ事ができる。 #myterm2(){{ > con = file("sample.txt", open="w") > cat("This is Sample!", "Hello R!!", "This is 3rd Line.", file=con, sep = "\n") > close(con) > > system("cat sample.txt") This is Sample! Hello R!! This is 3rd Line. }} #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>) ** applyファミリー [#q37ae16b] #html(<div style="padding-left: 10px;">) 他の言語の map や apply 等と同様に R にも行列やデータフレームの各要素に対して関数を適用する仕組みがある。 ※Rのループは遅いので繰り返し処理の内容を関数化しておいて apply する等の用途でも利用される。 *** apply [#ac005357] #html(<div style="padding-left: 10px;">) apply は行列やデータフレームの各要素に関数を適用する。 形式) | apply(X, MARGIN, FUN, ...) | 引数) | 引数 | 説明 | | X | データフレーム または 行列を指定する | | MARGIN | 行に対して処理する場合は 1 、列に対して処理する場合は 2 、両方に対して処理する場合は c(1,2) を指定する | | FUN | 適用する関数を指定する | 利用例1) #myterm2(){{ > x = data.frame(col1=c(1,2,3,4,5), col2=c(6,7,8,9,10), col3=c(11,12,13,14,15)) > x col1 col2 col3 1 1 6 11 2 2 7 12 3 3 8 13 4 4 9 14 5 5 10 15 > apply(x, 1, sum) # 行毎の合計 [1] 18 21 24 27 30 > apply(x, 2, sum) # 列毎の合計 col1 col2 col3 15 40 65 }} 利用例2) #myterm2(){{ > myfunc <- function(x){ + return (x*2) + } > apply(x, 1:2, myfunc) col1 col2 col3 [1,] 2 12 22 [2,] 4 14 24 [3,] 6 16 26 [4,] 8 18 28 [5,] 10 20 30 }} #html(</div>) *** lapply [#yf11f6b5] #html(<div style="padding-left: 10px;">) リストに関数を適用しリストを返却する。 #TODO #html(</div>) *** sapply [#c0a3b5a9] #html(<div style="padding-left: 10px;">) リストに関数を適用しベクトル または 行列を返す。 #TODO #html(</div>) *** tapply [#b78b5672] #html(<div style="padding-left: 10px;">) グループ化されたデータについてグループ毎に関数を適用する。 形式) | tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE) | 引数) | 引数 | 説明 | | X | データフレーム または 行列を指定する | | INDEX | グループ分けに使用するデータを リスト または factor で指定する ( [[因子型(factor)>#o9d6403e]] ) | | FUN | 適用する関数を指定する | 利用例) #myterm2(){{ > name <- c("Yamada", "Tanaka", "Sato", "Suzuki", "Yamamoto", "Takahashi", "Kobayashi", "Kato", "Ito", "Watanabe") > sex <- c("W", "M", "M", "M", "W", "W", "W", "W", "M", "W") > state <- c("Osaka", "Tokyo", "Osaka", "Osaka", "Nagoya", "Osaka", "Tokyo", "Tokyo", "Nagoya", "Tokyo") > height <- c(170.5, 175.4, 171.2, 173.6, 169.8, 165.2, 178.1, 165.5, 173.2, 172.9) > > x <- data.frame(Name=name, Sex=sex, State=state, Height=height) > > # 都道府県ごとの平均身長 > tapply(x$Height, list(x$State), mean) Nagoya Osaka Tokyo 171.500 170.125 172.975 > > # 男女毎の平均身長 > tapply(x$Height, list(x$Sex), mean) # INDEXには tapply(x$Height, factor(x$Sex), mean) で factor を指定してもOK M W 173.3500 170.3333 > > # 都道府県、男女毎の平均身長 > tapply(x$Height, list(x$State, x$Sex), mean) M W Nagoya 173.2 169.8000 Osaka 172.4 167.8500 Tokyo 175.4 172.1667 }} #html(</div>) *** mapply [#o0959c3b] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) #html(</div>) ** 乱数の生成 [#d8aad4ea] #html(<div style="padding-left: 10px;">) 乱数の生成を行う為の関数が豊富に用意されている。 *** 正規分布 [#tade1190] #html(<div style="padding-left: 10px;">) 例)身長データを100個生成する。(平均値は 170、標準偏差は 10とする) #myterm2(){{ > x = rnorm(100, mean = 170, sd = 10) # 乱数の生成 > round(x, digits = 1) # 小数点以下1桁になるように四捨五入 [1] 164.3 180.4 182.8 190.1 154.7 177.2 168.7 167.2 160.9 177.9 168.2 173.4 168.7 177.5 166.9 163.7 174.2 153.8 [19] 187.5 164.4 154.6 172.6 175.1 181.1 184.3 148.7 172.7 160.8 149.0 163.7 184.1 162.7 161.8 183.5 171.8 177.9 [37] 164.6 170.1 165.5 182.7 178.2 171.7 156.0 177.9 174.0 186.0 153.5 176.4 183.5 166.2 179.9 174.1 146.0 159.1 [55] 169.1 163.7 172.6 165.2 171.3 184.8 177.0 181.6 164.6 154.1 178.9 175.7 170.1 155.8 161.9 153.9 186.8 184.9 [73] 170.0 176.7 166.7 166.5 177.8 179.4 169.6 179.1 177.6 169.7 175.8 151.1 178.9 183.6 158.3 172.0 149.6 162.6 [91] 158.6 153.6 180.5 177.6 168.4 163.0 171.2 159.9 156.3 173.2 }} #html(</div>) *** XXXXXXXXXX [#s421882e] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) #html(</div>) ** 因子型(factor) [#kc87be93] #html(<div style="padding-left: 10px;">) *** 因子型の概要 [#c02f8059] #html(<div style="padding-left: 10px;">) #TODO #html(</div>) *** 因子型の利用例 [#o9d6403e] #html(<div style="padding-left: 10px;">) #TODO(tapplyでの利用例) #html(</div>) #html(</div>) ** 分析関数 [#d8052aae] #html(<div style="padding-left: 10px;">) #TODO // http://cse.naro.affrc.go.jp/takezawa/r-tips/r/71.html *** 回帰分析 [#t1cbccc5] #html(<div style="padding-left: 10px;">) #html(</div>) #html(</div>)