☆R
※御本家R project様へのURLが以下に
The R Project for Statistical Computing
※R言語PKG所蔵のサンプル・データ・セットに触れるシリーズが以下に
┌──┐
│目次│
├──┘
│◎R 文法
│ ◆コメント
│ ◆算術演算
│ ◆変数
│ ◆データとデータ構造
│ ◆関数
│ ◆制御文
│ ◆入出力
│ ◆グラフィクス
│ ◆TIPS
│◎R オペレーション
│◎RStudio
│◎Rパッケージ
#記号から行末まで
※演算子の基本順序 PEMDASに従う
│ Parenthesis
│ Exponents
│ Multiplication
│ Division
│ Addition
│ Subtraction
変数は任意の型のデータを保持できる。
変数名は 英字かピリオドで始まる英数字とピリオドとアンダースコア
大文字、小文字は区別される
⇒ピリオドで始まる変数は可視でなくなり、ls()では見つからなくなる
※代入演算子
<-
または
=
⇒ <-演算子は逆方向を指してもよい。また、連続して用いれば複数代入も可能
※assign(“変数名”, 値)
でも代入可能
※変数の削除
remove
rm
※変数の型を調べる
class(変数)
※オブジェクトをリストする
ls()
_◇単純(スカラ)データ型
numeric
│ 整数、小数
│ is.numeric()
│ as.numeric()
integer
│ 整数
│ 明示的にintegerにするには数字の後ろにLをつける
│ is.integer()
Date/POSIXct
│ Date 日付
│ 1970/1/1からの日数
│ POSIXct 日付と時刻
│ 1970/1/1からの秒数
⇒文字列を as.Date()、as.POSIXct()関数に渡すことで変換できる
※lubridateパッケージ
日付操作のための関数
│ year
│ monthなど
│
logical
│ TRUE 1
│ FALSE 0
│ is.logical()
⇒TとFというTRUE, FALSEを格納された変数が存在する
_◇文字列データ型
character(文字列)
│ 文字列データ
│ nchar() 文字列の長さを得る
※sprintf(“書式”, 変数,…
│ cと類似の書式文字列に従って変数を文字列とする
_◇ベクトル
│ 同じ型の要素を集めたもの
│ 次元も、縦、横の区別もない
⇒Rはベクトル化された言語であり、vectorに関してループを書く必要はない
⇒ベクトルはリストの一形式
⇒各要素にアクセスするには[]
│ 最初の要素が1
│ 連続していたら : 演算子
│ 不連続なら c(要素番号,…)
│ で指定する
⇒連続した数列の生成演算子
│ 開始:終了(終了を含む)
ベクタの要素には名前をつけることができる
│ names(ベクタ)<-文字列のベクトル c(“a”,…)など
⇒通常の演算子でベクトル演算が可能
│ ベクトルとスカラの演算
│ 長さの等しいベクトルの要素間の演算
│ 長さが不等の場合は短いベクタを繰り返し使用する(短の倍数=長であること)
│ 比較演算の場合はTRUE/FALSEからなるベクトルとなる
│ all() 全て真
│ any() すくなくとも一つ真
⇒ベクトルの長さ
│ length(ベクトル)
※c combine関数でベクトルを作成
c(ベクトル要素, …)
※ベクトル変数を使って特定の条件のものに値を代入する
例)
d$a[d$b < 33] <- 0
_◇factor
│ 文字列シンボルだが、識別のためのデータ
│ as.factor()
※levelsはFactor変数の保持する重複のない値の数
⇒内部的にはlevelsに対してintegerを割り当てている
⇒as.numeric()で取り出せる
※通常、levelsの順序は考慮されない
⇒factor関数で生成時に ordered=TRUEとすると順序づけられたfactorとなる
例)
factor(x=c(“a”,…), ordered=TRUE)
※等価性の検証
identical(データ, データ)
_◇欠損値
※ NA
is.na()
欠損値であればTRUE, そうでなければFALSEを返す
※欠損値の取り扱い
①多重代入法
│ mi, mice, Ameliaパッケージ
例)NAのある要素に対する集計
> theMatrix[2,1]<-NA > theMatrix [,1] [,2] [,3] [1,] 1 4 7 [2,] NA 5 8 [3,] 3 6 9 > apply(theMatrix, 1, sum) [1] 12 NA 18 > apply(theMatrix, 1, sum, na.rm=TRUE) [1] 12 13 18
※NAのデータの有無を真偽値で確認
any(is.na(d$b))
※NAの場合、値を0にする
d$a[is.na(d$b)] <- 0
_◇NULL
NULLは欠損ではなく、存在しないことを示す
⇒NULLをvectorの中で使用しても消えてしまう
is.null()
_◇data.frame
行と列を持つ
行 観測値
列 変数
※各列は長さの等しいベクタ
│ 列内は同じ型のデータ
│ 異なる列は異なる型を持てる
※データフレームの生成
ベクタ x, y, zから
data.frame(x, y, z)
⇒生成時に各列に名前を付けられる
data.frame(列名=ベクトル変数, …)
※行、列の数
nrow() 行
ncol() 列
dim() 行と列
※行名、列名の列挙
names() 列名
rownames() 行名
⇒代入することで行名、列名を変更することもできる
※頭、末尾の表示
head(データフレーム)
head(データフレーム, n=行数)
tail(データフレーム
※行、列へのアクセス
データフレーム$列名
データフレーム名[行, 列]
⇒ : 演算子を使うことで複数の行、列を指定可能。
⇒行を省略すれば、指定列のすべての行分、列を省略すれば、指定行1行を取得
⇒列名のベクトルを列に与えれば該当列のみとりだせる(行名も同様)
⇒[,列指定]で1列の取り出しはベクトルとなるが、[列名]で取り出すとデータフレームとなる。[,列指定,drop=FALSE]とすれば必ずデータフレームとなる
データフレーム名[[列の指定]]
二重カッコを使っても列を指定できる。
※ダミー変数の生成
model.matrix関数
⇒一つの列がfactorの各レベルに対応するようなダミー変数を作り出す
xをfactorベクトルとすると
model.matrix(~x – 1)
でダミー変数が作られる
※特定条件の行を抽出
例)
df <- df[df$v >= 50, ]
※with()関数
データフレーム名をいちいち指定しなくとも列を参照できる
with(データフレーム, 列をつかった計算式)
_◇data.table
data.frameの機能を拡張したパッケージ
⇒data.frameにない、インデックスを持つので高速
⇒data.frameと構文が少しことなる
※tables()でメモリ中の全data.table名を表示
※setkey(データテーブル, キー列)
キーを設定
※key(データテーブル)
キー列を表示
キーを設定すると
データテーブル[キー値, ]
でキーにヒットする全データを取り出せる
⇒複数のキー値をベクトルにしてもよい
※setkeyで複数の列をキーとした場合、J()関数で複数のキーをつないで検索する
データテーブル[J(キー値1, キー値2), ]
※組み込み集約機能あり
aggregate(price ~ cut, diamonds, mean)
と同等な処理は
diamondsDT[, list(price=mean(price), by=cut]
でできる
⇒適用処理も、byもlistで与えることができるので複雑な集計ができる
_◇リスト
任意の型の要素を任意の数だけ格納可能
data.frameでもlistでもlistの中に格納できる
⇒リストはベクトルの上位概念 generic vectors
※listの作成
list(要素,…)
※リストの要素にも名前をつけたりできる
names()
※任意の長さの空のlistを作成できる
vector(mode=”list”, length=長さ)
※任意の要素1個は二重カッコ[[要素番号または名前]]で取り出せる。
※要素の追加は存在しない番号か名前を[[]]にいれて代入すればよい
※長さ
length()
※ソート
order(変数, decreasing = TRUE|FALSE)
_◇マトリックス Matrix
行と列があるが、すべて同じ型
2次元に制限される
vectorと同様な演算ができる(vectorはmatrixの特殊型)
data.frameと同様にnrow, ncol, dimの対象となる。
※マトリックスの生成
matrix(要素の初期値リスト, nrow=行数)
※行列積 %*%演算子
MatrixA %*% MatrixB
※転置
t(Matrix)
※行と列に名前をつけることができる
colnames()
rownames()
⇒既定のベクタ lettersとLETTERSが名ずけに適する
小文字と大文字の各26文字からなるベクタ
※行、列の合計
rowSums()
colSums()
_◇アレイ Array
多次元のVector
マトリックスと異なり、任意の次元をもてる
_◇データの部分抽出
※which関数により、条件がTRUEのデータのみを取り出すことができる
例)
require(lubridate)
economics$year<-year(economics$date)
econ2000<-economics[which(economics$year>=2000),]
_◇データ操作
分割
│ ある基準に基づいてデータを異なる部分に分割する
適用
│ 各部分に適当なデータ変換を行う
結合
│ すべての部分を再結合させる
_◇グルーピング操作
※apply(a1, a2, a3, a4…)
行列の行、列に適用⇒全要素は同じ型
data.frameに適用⇒matrixに変換される
a1 適用対象のデータオブジェクト
a2 1で行、2で列
a3 適用する関数
a4… a3の関数に渡される
例)
theMatrix<-matrix(1:9, nrow=3)
apply(theMatrix, 1,sum)
※lapply(a1, a2)
リストに適用、結果をリストで返す
例)
theList <- list(A=matrix(1:9,3), B=1:5, C=matrix(1:4,2), D=2)
lapply(theList, sum)
⇒リストの中にMatrixが含まれれば、その要素に対しては行列の要素の総和が返る
※sapply(a1, a2)
リストに適用、結果をベクトルで返す
※mapply(f, l1, l2)
指定した関数fを複数のリストl1, l2の各要素に適用する
例)2要素の等価性を判定するidentical(x, y)をmapplyする
> firstList<-list(A=matrix(1:16,4), B=matrix(1:16,2), C=1:5)
> secondList<-list(A=matrix(1:16,4), B=matrix(1:16,8), C=15:1)
> mapply(identical, firstList, secondList)
※その他のapply関数群
tapply, rapply, eapply, vapply, by
※集約関数 aggregate(fm1, dat, func, a4…)
fm1 計算したい変数 ~ 計算でグルーピングしたい変数 の形のフォーミュラ
dat データ
func 適用される関数
a4以降の追加の名前付き引数をfuncに渡すことができる
例)
> aggregate(price~cut, diamonds, mean) cut price 1 Fair 4358.758 2 Good 3928.864 3 Very Good 3981.760 4 Premium 4584.258 5 Ideal 3457.542
⇒1変数以上でグルーピングするには+で変数をつなぐ
計算したい変数 ~ g1 + g2 + …
⇒1変数以上を集約計算の対象とするには左辺をcbind()で結合する
cbind(変数1, …) ~ g1 + …
※plyrパッケージ
データ操作関数名は以下のルールによる
XYply
X 入力データ形式
Y 出力データ形式
│ d data.frame
│ l list
│ a array/vector/matrix
│ _ なし
ddply
│ データフレームをある変数に従って分割、処理を適応し、データフレームを返す
│ 第1引数データフレーム
│ 変数指定 .variables = “列名”
│ 処理指定 .fun = 関数名
llply
aaply
dlply
daply
d_ply
ldply
laply
l_ply
adply
alply
a_ply
※plyr ヘルパー関数
each()関数
⇒aggregate関数のような関数に複数の関数を渡すことができる
例)
aggregate(price ~ cut, diamonds, each(mean, median))
idata.fram()関数
⇒アクセスを高速にできるデータフレームを作成
_◇データ整形
※行数が同じデータの横結合
cbind()
⇒引数のベクトルに対して新しい列名をつけることもできる
※列構成が同じデータの縦結合
rbind()
※データのJoin
merge()関数
2つのデータフレームを結合する
mergeData<-merge(x=D1, y=D2, by.x=c(“F1”, “F2”), by.y=c(“F3”, “F4”))
⇒キーになる列名が異なっていてもよい
plyrパッケージのjoin()関数
mergeData<-join(x=D1, y=D2, by=c(“F1”, “F2”))
⇒キーになる列名は同じでないとならない
_◇formula
線形モデルの記述
集約計算
などで使われる記法
左辺 ~ 右辺
_◇関数定義
変数 <- function([仮引数リスト])
{
│ 命令行
}
⇒行の終わりに ; をつけても良いが、Rの作法ではない
※引数のデフォルト値
仮引数 = デフォルト値
※可変個の引数
… 任意個の追加引数をとることの指定
※返却値
①関数の最後の行の値が暗黙的に返される
②return(返却値)
_◇呼び出し
関数名(引数リスト)
引数を与える場合)
│ ①引数の順序で実引数を与える
│ ②仮引数の名前で代入する
⇒混在も可だが、引数の順序は②の代入も含めて固定
_◇do.call()関数
do.call(関数名, args = 関数に与える引数のリスト)
argsを引数として、関数名で与えられる関数を実行させる
_◇関数ドキュメント
?関数名
│ 関数のドキュメントが表示される
※演算子に対するドキュメント
演算子の場合はバッククォートで囲む
例)
?`+`
※関数名の一部からの関数検索
apropos(“関数名の一部”)
_◇if elseとswitch
if (比較演算)
{
│ 真で実行される行
}
else
{
}
※else if
※else if を続ける代わりに swith()関数がある
switch(第1引数, 第2引数…)
第2引数…の形
“文字”=”値文字列”
第1引数が文字の場合、第2引数…の文字にマッチした値文字列が返る
マッチしないと最後の文字列が返る
第1引数が数字の場合、数字で示される引数が返る
│ 数字=1なら第2
│ 数値引数の値が引数の数を超えるとNULLが返る
_◇ifelse
ifelse(テスト条件, 真の時の値, 偽の時の値)
※この関数はベクトル化された引数でも動作する
⇒ベクトルの中にNAがあった場合、真、偽は判定されず NAが返る
_◇論理演算
※二重系 1要素だけを論理演算
&& and
|| or
⇒左辺のテストで真偽の判別つけばそれ以上計算されない
※一重系 各要素それぞれに論理演算
& and
| or
⇒全要素がチェックされる
※andがorよりも優先される
_◇ループ
※forループ
例)
for (i in 1:10)
{
│ …
}
変数名 in ベクトル
⇒ベクトルは数値でなくても要素の数だけ繰り返される。
※whileループ
while(条件式)
{
│ …
}
※next
│ 次の繰り返しへ
※break
│ ループを脱出
※ベクトル化処理や行列でループを避けられるのであれば避ける
※入れ子になったループはさける
⇒極端に遅くなる
_◇CSVの読み込み
⇒read.csvでできることは read.tableでもできる。
⇒結果はdata.frame
※最初の引数は読み込みたいファイルへのフルパス。
⇒urlでもよい
例)
theUrl <- “http://…”
x <- read.table(file=theUrl, header=TRUE, sep=”,”)
⇒タブ区切りの場合は”\t”とする
⇒stringAsFactors=FALSEと指定すると文字列は文字列のままとなる
⇒デフォルトはTRUEなので、Factorに変換される。
⇒quote引数により、””で囲まれている場合に対応
⇒colClassesにより各列のデータ型を指定
※read.csv2
⇒ヨーロッパ仕様のCSV
小数点がコンマ、区切り文字がセミコロン
※Excelを読み込めるパッケージもあるが、CSVに変換後取り込む方が確実
_◇ODBC接続
require(RODBC)
_◇Rバイナリ
.RData型式
任意のRオブジェクトを保存できる
Windows, Mac, Linuxで互換性あり
※セーブ
save(変数, file = “ファイル名.rdata”)
※ロード
load(“ファイル名.rdata”)
_◇Rの内蔵データ
Rの各パッケージにはデータを含むものがある
data()
│ 現在利用可能なデータの一覧
│
data(データ名)
│ データを読み込む
_◇HTMLテーブル
データがHTMLのテーブル形式におさまっているならば抜き出すことができる
例)
require(XML)
theURL <- “http://www.jaredlander.com/2012/02/another-kind-of-super-bowl-pool/”
bowlPool <- readHTMLTable(theURL, which=1, header=FALSE, stringAsFactors=FALSE)
which 何番目のテーブルを読むか
※Webデータのスクレイピング
_◇ファイルのダウンロードとunzip
download.file(url=”…”, destfile=”パス”)
unzip(“パス”, exdir=”パス”)
_◇ファイルに対するループ処理
require(stringr) theFiles <- dir("...", pattern="nn.csv") for(a in theFiles) { nameToUse <- str_sub(string=a, start=12, end=18) tmp <- read.table(file=file.path("...", a), header=TRUE, sep=",", stringAsFactors=FALSE) assign(x=nameToUse, value=temp) }
_◇画面に対するprint
インタラクティブモードでは変数名を入力すればその内容が表示される。
プログラムとしてRスクリプトを実行中は、変数名単独では内容は表示されない
内容の表示には print(変数)と明示的に書く
⇒ただし、インタラクティブモードの変数表示と同等なので引数は1変数のみ
⇒複数変数を1行に表示する場合は、sprintf()でまず文字列を作る
※グラフィクスを用いる理由
①探索的データ解析 (exploratory data analysis, EDA)
②結果の説明
_◇ggplot2
基本グラフィクスよりも美しいグラフを簡単に記述できる
①ggplot()関数の第1引数にデータを与えてオブジェクトを初期化
②+記号に続けてレイヤーを追加
│ geomの追加される順番によりレイヤーの重なりが決まる
③レイヤー内では、変数をaes関数を用いて「審美」にマッピング
※審美的属性
aesthetic attribute
※samll multiples描画機能
⇒横軸が同じで縦軸の変数だけが違う一連のグラフの描画
facet_wrap
│ ある変数の水準に応じ元データを分割してからプロット
│ 行、列には意味がない
│ 例)
│ g+geom_point(aes(color=color))+facet_wrap(~color)
facet_grid
│ ある変数の水準に応じ元データを分割してからプロット
│ 行、列に変数の水準を割り当てる
│ 例)
│ g+geom_point(aes(color=color))+facet_grid(cut~clarity)
※ggtheme
描画テーマの追加
例)エコノミスト誌風にする
g2<-ggplot(diamonds, aes(x=carat, y=price))+geom_point(aes(color=color))
g2 + theme_economist()
theme_excel()
theme_tufte()
theme_wsj()
_◇ヒストグラム、密度描画
ヒストグラム:離散的
密度描画:連続的
│ カーネル密度推定 stat_density
※基本グラフィクス
例)
hist(diamonds$carat, main=”Carat Histogram”, xlab=”Carat”)
※ggplot2
例)
ggplot(data=diamonds)+geom_histogram(aes(x=carat))
例)密度描画
ggplot(data=diamonds)+geom_density(aes(x=carat), fill=grey(0.5))
⇒fillはグラフ全体を指定した色にする
_◇散布図
※基本グラフィクス
例)フォーミュラ使用の指定
plot(price~carat, data=diamonds)
例)x, yを個別に指定
plot(X, Y)
※ggplot2
例)color審美
g<-ggplot(diamonds, aes(x=carat, y=price))
g+geom_point(aes(color=color))
_◇箱ひげ図、ヴァイオリン・プロット
boxplot
※基本グラフィクス
例)
boxplot(diamonds$carat)
※ggplot2
例)1変数caratの箱ひげ図
ggplot(diamonds, aes(y=carat, x=1))+geom_boxplot()
例)1変数caratをcutの水準毎に分割した箱ひげ図
ggplot(diamonds, aes(y=carat, x=cut))+geom_boxplot()
例)ヴァイオリン・プロット
ggplot(diamonds, aes(y=carat, x=cut))+geom_violin()
_◇折れ線グラフ
※ggplot2
例)
ggplot(economics, aes(x=date, y=pop))+geom_line(aes(group=1))
⇒group=1とすれば1本の線
⇒group=変数とすれば、変数の水準毎に別の線となる。
⇒色を付けたい場合
│ color=離散的な値の変数(Factorなど)
│ 例)
│ color=factor(year)
_◇表示
代入式を()でくくることで、代入結果を画面に表示できる
◆CLI
コマンドの中断 ESCキー
◆Rセッション
Rの利用中にメモリ上に保持される全てのオブジェクトと実行結果
◆Project
互いに関連しあったファイルをワーキングディレクトリにまとめられる
◆Editor
1行のコマンド実行 CTRL+Enter
ファイル全体の実行 CTRL+SHIFT+S
TABによる自動補完
CTRL+1 テキストエディタ
CTRL+2 コンソール
◆パッケージの探索
CRAN Task Views
http://cran.r-project.org/web/views/
◆パッケージのインストール
RStudioの場合)
│ Packagesウインドウで一覧でき、GUIからインストール可能
│ ⇒Install fromをローカルに切り替えることで、zipやtar.gzからのインストールも可能だが、その場合は依存関係は解決されない。
│
コンソールの場合)
> install.packages(“パッケージ名”)
GitHubなどから直接インストールする場合)
> require(devtools)
> install_github(repo=”パッケージ名”, username=”ユーザ名”)
◆パッケージのロードとアンロード、呼び出し
※library
※require
パッケージをロードし、成功、失敗を真偽で返す。
⇒プログラム内部でのロードに向く
※アンロードする場合
detach()関数
構文)
detach(“package:パッケージ名”)
※同じ名の関数が複数のパッケージに入っていた場合、後の方が呼ばれる。
※パッケージを明示的に指定する場合
パッケージ名::関数名(…)
のようい呼ぶ
◆XML
◆survival
生存時間分析
◆sp
空間データ