R言語は、統計解析向けのプログラミング言語及びその開発実行環境。
以下の URLからインストーラをダウンロードしてインストール
Rがインストールされている環境で r を入力すれば、R がインタラクティブモードで起動する。
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()
> q() Save workspace image? [y/n/c]: n
※ --save または --no-save オプション付きで起動した場合は、終了時の確認メッセージは表示されない。
?コマンド名 でコマンドのヘルプを表示する事ができる。
例)
> ?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, . .
変数への代入は <- または -> で行う。
以下は、1〜5までの連続した値のベクトルを生成し、x という変数に代入している。
> x <- c(1:5) > x [1] 1 2 3 4 5
複数の変数に代入する事も可能
> x <- y <- 1:5 > x [1] 1 2 3 4 5 > y [1] 1 2 3 4 5
左辺と右辺は入れ替える事も可能
> 1:5 -> x -> y > x [1] 1 2 3 4 5 > y [1] 1 2 3 4 5
n:m と記述する事で連続した値を生成する事ができる。
> 1:5 [1] 1 2 3 4 5
開始値, 終了値, 増分 を指定して値を生成する場合は seq を使用する。
> seq(1, 5, 2) [1] 1 3 5
任意の値をN個分繰り返すには rep を使用する。
> rep(1, 5) [1] 1 1 1 1 1
値には ベクトルを指定する事もできる。
> rep(1:3, 5) [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
定義した全ての変数の一覧を ls() で確認する事ができる。
> x <- 1:10 > y <- 101:110 > ls() [1] "x" "y"
rm で定義した変数を削除する事ができる。
> x <- 1:10 > y <- 101:110 > ls() [1] "x" "y" > rm(y) > ls() [1] "x"
rm の 名前付き引数 list に変数名の一覧を指定して削除する事もできる。
※以下は、全ての変数を削除する例。
> x <- 1:10 > y <- 101:110 > ls() [1] "x" "y" > rm(list=ls()) > ls() character(0)
別ファイルに保存したスクリプトを読み込むには source を使用する。
test.R
x = c(1:5)
実行例
> source("test.R") > x [1] 1 2 3 4 5
Rでは作業中のワークスペースの状態をワークスペースに保存しておき、後から復元する事ができる。
変数 x, y, z を定義してRを終了(確認で y を入力)
R > x <- 1:10 > y <- 101:110 > z <- 201:210 > q() Save workspace image? [y/n/c]: y
再開
R . . [以前にセーブされたワークスペースを復帰します] > ls() [1] "x" "y" "z"
R を --save または --no-save オプション付きで起動した場合は、Rの終了時に確認メッセージは表示されない。
※自動的に保存して(または保存しないで)終了する。
尚、変数 及び 履歴情報は作業ディレクトリ配下の .RData 及び .Rhistory というファイルに保存されている。
※これらのファイルを消せばワークスペースの状態を初期化できる。
test.R
x <- 1:10 cat(x)
実行
rscript test.R 1 2 3 4 5 6 7 8 9 10
> x <- 1:10 > x [1] 1 2 3 4 5 6 7 8 9 10
> x <- 1:10 > print(x) [1] 1 2 3 4 5 6 7 8 9 10
書式付きでオブジェクトを表示する場合には sprint を使用する。
> sprintf("%3.2f", 123.456) [1] "123.46"
cat を使用すれば文字列をダブルクォーテーションなしで表示できる。
> str1 = "ABCDEFG" > cat(str1) ABCDEFG
str を使用すると、オブジェクトの内容をデータ型などの情報付きで表示できる。
> str1 = "123" > str(str1) chr "123"
> x = 10 > if (x > 5) { + print("x > 5") + print(x) + } else { + print("x <= 5") + print(x) + } [1] "x > 5" [1] 10
繰り返し処理には for文が使用できる。
ただし R の for文は遅いので処理を関数化して apply系で記述する方が高速に動作する。
> for (i in 1:5) { + print(i) + } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5
以降の例で使用する csv ファイルは以下の通りとする。
browser-JP.csv ( http://gs.statcounter.com/browser-market-share/all/japan より )
"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
file
write
writeLine
read.table で CSVファイルからデータフレームを生成できる。
> 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ファイルに出力できる。
> write.table(x, "output.csv", quote=F, col.names=T, row.names=T, sep=",")
※詳細は ?write.table で確認。
write.xlsx()
write.xlsx2()
R ではオブジェクトそのものをファイルに保存したり、ファイルから復元する事ができる。
ベクトル x をファイルに保存)
> x <- 1:10 > x [1] 1 2 3 4 5 6 7 8 9 10 > save(x, file="x.rdata")
いちど変数を削除後にファイルから x を読み込む)
> rm(x) > x エラー: オブジェクト 'x' がありません > load("x.rdata") > x [1] 1 2 3 4 5 6 7 8 9 10
> paste("abc", "def", sep="") [1] "abcdef"
c() でベクトルの生成を行う事ができる。
> x <- c(100,200,300) > x [1] 100 200 300
連続した値のベクトルであれば n:m でも生成可能。
> x <- 1:5 > x [1] 1 2 3 4 5
他にファイルからデータを読み込んでデータフレームを生成する事も可能。( CSVファイルの入出力 を参照 )
要素番号を指定して特定の要素にアクセスする事ができる。
> 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
要素番号を指定して特定の要素にアクセスする事ができる。
> 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のデータフレーム等と同じやり方)
> 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
c() でベクトルを結合した別のベクトルを得る事ができる。
※c() の引数に指定したベクトル自体の内容は変わらない。
> 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
append を使用するとベクトルに要素を追加した別のベクトルを得る事ができる。
※append の引数に指定したベクトル自体の内容は変わらない。
> 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
matrix で行列を生成する事ができる。
> 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
行列の各要素へは [行No, 列No] でアクセス可能。
> 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
以下のように、特定の値を変更する事も可能。
> 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!" に書き換えている。
> 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のデータフレームと同じ様に Bool値のリストを作って真となるの要素を書き換える事も可能。
> 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"
rbind または cbind で行列を結合する事ができる。
※rbindは縦に行を結合、cbind は横に列を結合。
> 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
行列の和、差
> 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
行列の積
> 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での演算結果 とも一致する。
ベクトルや行列などの異なる構造のデータを集めて 1 個のオブジェクトに纏める場合にはリストを使用する。
> 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
リストの要素には [要素番号] または 要素番号 でアクセスする事ができる。
[要素番号] でアクセスした場合の戻り値はリスト、要素番号でアクセスした場合の戻り値は要素の内容そのものとなる。
> l = list(1,2,3) > l[1] [[1]] [1] 1 > l[[1]] [1] 1
データフレームを使用すると異なる型のデータをまとめて1 つの変数として持つ事ができる。
単純な行列と違い、各行/列はラベルを持ち、ラベル指定による操作が可能。
列のデータ型が異なっていても扱える為、ベクトルやリストをデータフレームに変換することで統計解析がやりやすくなる。
データフレームは data.frame(列名=ベクトル, 列名=ベクトル, ... ) の形式で生成する。
> # 行ラベル > 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
summary で列毎の概要を表示する事ができる。
> 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
as.matrix による変換
> 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 を噛ましてラベルを落とす
> 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 を設定して名前を落とす
> 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