Software_R

☆R

※御本家R project様へのURLが以下に

The R Project for Statistical Computing

※R言語PKG所蔵のサンプル・データ・セットに触れるシリーズが以下に

データのお砂場

┌──┐
│目次│
├──┘
◎R 文法
│ ◆コメント
│ ◆算術演算
│ ◆変数
│ ◆データとデータ構造
│ ◆関数
│ ◆制御文
│ ◆入出力
│ ◆グラフィクス
│ ◆TIPS
◎R オペレーション
◎RStudio
◎Rパッケージ


◎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)


◆TIPS

_◇表示
代入式を()でくくることで、代入結果を画面に表示できる


◎R オペレーション

◆CLI

コマンドの中断 ESCキー

◆Rセッション

Rの利用中にメモリ上に保持される全てのオブジェクトと実行結果


◎RStudio

◆Project
互いに関連しあったファイルをワーキングディレクトリにまとめられる

◆Editor

1行のコマンド実行 CTRL+Enter
ファイル全体の実行 CTRL+SHIFT+S
TABによる自動補完
CTRL+1 テキストエディタ
CTRL+2 コンソール


◎Rパッケージ

◆パッケージの探索
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
空間データ