ふとした機会に自分のRスキルを診断したところ、かなり低いことが判明…。そこで基礎から改めて勉強することにした。
今回は以下を参考にした。
http://ds.k.kyoto-u.ac.jp/e-learning_files/data_analysis_basic/slide-a02.pdf
はじめに:Rとは?
データ解析に特化したプログラミング言語。
特徴 |
||
(1) | フリーウェアで無償利用可能。 | |
(2) | オープンソフトウェア。個人が開発・改良できる。 | |
(3) | プログラミング言語で自由にロジックが記述可能、汎用性が高い。 | |
(4) | プログラミングに慣れてない人にはとっつきにくい。 | |
(5) | ソフトウェアR上で記述し、対話式である。 | |
(6) | 行列計算、ベクトル計算は速く、それらを用いる統計処理は高速。 | |
(7) | それ以外のループや条件分岐などを自分で書くと大変遅い。 | |
(8) | GUIである程度できるRコマンダーや,統合開発環境のRStudioなどもある。 |
1. プログラムの書き方の基礎
- 1行1行実行したい文を書く。
- 1行に複数の文を書く場合、文を「;」で区切る。
- 打ち間違えなどで前の行の続きと見なされている状態を抜けるためには、Escキーを押す。
- 不明点は以下でHTMLドキュメントが表示される。
# ヘルプをHTMLで表示させる help.start()
1.1 Rに関係するファイル
(1) | XXX.R: | スクリプト Rのプログラムを記述する。 | |
(2) | XXX.RData,XXX.Rda: | 複数(すべて)の変数(オブジェクト)の値を保存する。 | |
(3) | XXX.Rds: | ある1つの変数(オブジェクト)の値を保存する。 |
# 書いたスクリプトを一気に実行させる source("XXX.R") # 全変数を保存 save.image("XXX.RData") # 変数 x と y を保存 save(x,y,file="XXX.RData") # 読み込み load(file="XXX.RData") # 変数xを保存 saveRDS(x, "XXX.Rds") # 読み込んでyに代入 y <- readRDS("XXX.Rds")
1.2 ファイルの指定方法
# 作業フォルダの確認 getwd() # 作業フォルダの設定 setwd("C:/Users/admin/Documents") # 作業フォルダにあるファイルはファイル名のみで良い(拡張子は不要) read.table("filename") # 一般的には、絶対パスか作業フォルダからの相対パスで記述する read.table("datdir/filename") read.table("C:/Users/admin/Documents/datdir/filename") read.table("C:\\Users\\admin\\Documents\\datdir\\filename") # ファイルをエクスプローラーを使って選びたい read.table(file.choose())
1.2 変数
変数はその値を代入 されることによって定義される。
Rで変数名はアルファベットおよび数字からなり、最初の文字は数字であってはならない。変数名では、大文字、小文字を区別する。
以下の名前は予約語であるため使用することはできない:break、else、for、function、if、in、next、repeat、return、while、TRUE、FALSE.
The tidyverse style guideは、変数名としては「すべて小文字」*1かつ「"-"または"_"」を用いるようにすることを推奨している*2:
# Good fit_models.R utility_functions.R # Bad fit models.R foo.r stuff.r 00_download.R 01_explore.R ... 09_model.R 10_visualize.R
# 変数の代入 x <- 1 # これが最頻用 1 -> x x = 1 x <<- 1 assign("x",1) # 変数を削除する rm(x) # 定義されている変数の一覧を取得する objects()
1.3 演算
+ | :足し算 | |
- | :引き算 | |
:掛け算 | ||
/ | :割り算 | |
%/% | :整数の割り算の商 | |
*または ˆ | :べき乗 | |
%% | :余り | |
%*% | :行列積 |
# 足し算 1 + 3 # 引き算 4-2.5 # 掛け算 3.3 * 4.1 # 割り算 4/3 # 整数の割り算 4%/%3 # べき乗 2**2 2^2 # 余り 4%%3 # %*% A <- matrix(c(4,3,2,1),nrow = 2, ncol = 2) B <- matrix(c(4,3,2,1),nrow = 2, ncol = 2) A%*%B # [,1] [,2] # [1,] 22 10 # [2,] 15 7
1.4 ベクトル
変数を複数並べたもの。Rでは数値以外もベクトルの構成要素として持ち得る。
# 文字列のベクトル vc.chrName <- c("Tanaka", "Yamada", "Hirata")
- 置換:ベクトルの要素の一部を置き換える場合は関数 replace() を用いることで実現できる.
x <- 1:5 # x の 2, 4 番目の要素を 0 に置き換える y <- replace(x, c(2,4), c(0,0)) # x の 2, 4 番目の要素をNAに置き換える z <- replace(x, c(2,4), NA) # z のNAである箇所を10で置き換える replace(z, which(is.na(z)), 10)
- ベクトルの要素の結合:2 個以上のベクトルを結合する場合は関数 c() を用いる。2つのベクトルを結合するだけならば関数 append() でも実現出来る。
x <- c(1, 2, 3); y <- c(4, 5, 6); z <- c(7, 8, 9) c(x, y, z) # 1 2 3 4 5 6 7 8 9 w <- append(x, z) w <- c(x,z)
- ベクトルの要素の挿入:関数 append() を用いることで,ベクトルの指定の場所にベクトルを挿入させることも出来る。
# w の 3 番目の要素の後に y を挿入 append(w, y, after=3)
1.4.1 ベクトルの演算
ベクトルの演算は要素ごとに行われる。ベクトルの長さが違う場合は,短いベクトルが周期的に拡張されて適応する。
ベクトルxに対し、x[k]でベクトルのk番目の要素を取る。kがベクトルなら,x[k]が表すベクトルのi番目の要素は,ベクトルのk[i]番目の要素を取る。
特にkとして論理値ベクトルを与えると、TRUEに該当する成分のみ抽出する。これをフィルタリングという。
# x<-1:3 で x[c(TRUE,FALSE,TRUE)] で c(1,3)になる x<-1:3 x[c(TRUE,FALSE,TRUE)]
1.5 行列
1.5.1 行列の作成
1つ目は、matrix(ベクトル, nrow=行数, ncol=列数(, byrow=TRUE))で構成。byrow=TRUEの場合、1行1列>1行2列>1行3列の順番でベクトルの要素を埋める。byrow=FALSEの場合もしくは指定しない場合、1行1列>2行1列>3行1列の順番でベクトルの要素を埋める。
matrix(c(1,2,3,4), nrow = 2, ncol = 2, byrow=TRUE) # [,1] [,2] # [1,] 1 2 # [2,] 3 4 matrix(c(1,2,3,4), nrow = 2, ncol = 2, byrow=FALSE) # [,1] [,2] # [1,] 1 3 # [2,] 2 4
2つ目は行(・列)ベクトルを並べて構成:rbind(x, y), cbind(x, y)。
x <- c(1,2,3) y <- c(4,5,6) rbind(x, y) # [,1] [,2] [,3] # x 1 2 3 # y 4 5 6 cbind(x, y) # x y # [1,] 1 4 # [2,] 2 5 # [3,] 3 6
1.5.2 行列の抽出
- x[2,4]:2行4列成分を取り出す。
- x[2,]:2行目からなるベクトルを取り出す。
- x[,4]:4列目からなるベクトルを取り出す。
- apply(x, 1, mean) で各行の平均からなるベクトルを求める。
- apply(x, 2, mean) で各列の平均からなるベクトルを求める。
1.6 条件分岐
if...else文を用いる。
x <- 50 if(x >0){ print("positive") }else if(x<0){ print("negative") }else{ print("zero") }
ベクトルの各成分にある1つの条件分岐を与えたい場合はifelse(ベクトル,TRUEの場合の出力,FALSEの場合の出力)を与える。
scores <- c(58, 100, 81, 97, 71, 61, 47, 60, 73, 85) pf <- ifelse(scores >= 60, "Pass", "Fail") pf