Advanced Rには「Vocabulary」という章があります。
特に解説はしないけど、これくらいは知っとけ、と。
神・Hadleyにそう言われれば、アッハイ!と答えるしかないわけですが、そうは言いつつけっこう知らないの多いかも、と思ったのでメモっておきます。
(と思って書き始めたけどメモってレベルの長さじゃなかった…)
The basics
The first functions to learn
?
ヘルプを呼ぶ魔法の合言葉。
str
オブジェクトの構造を表示してくれる関数。max.depth
とかvec.len
で表示する深さを制限できるのは意外と知らなかった。
Important operators and assignment
%in%, match
どちらも、ある要素が別の要素群の中にあるかをチェックする関数。match
はインデックスを返す。%in%
はTRUE
/FALSE
を返す。
ちなみに%in%
の定義はこうらしい。
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0
=, <-, <<-
どれも代入。違いの説明はややこしいので割愛。
$, [, [[, head, tail, subset
[
はアトミックなベクターやリスト、データフレームのサブセットをつくる関数。
[[
と$
はリストの要素を取り出す関数。ちなみに、$
は部分一致で動くらしい。知らなかった。。
head
とtail
は、それぞれはじめと終わりの一部分だけのサブセットをつくる関数。
subset
は、データフレームやリストの与えた条件を満たす要素だけのサブセットをつくる関数。Hadleyはこれ嫌いらしくてぶつぶつ言ってたのを見かけた記憶がある。
with
with(data, expr, ...)
という形で、data
をattach
した環境でexpr
を評価してくれる。%>%
に慣れすぎるともはや必要性を感じないかも。
assign, get
assign
は指定した名前のオブジェクトに値を代入する。get
はその逆に指定された名前のオブジェクトから値を得る。<-
と似てるけど、オブジェクト名をプログラム的に決めたいときとか便利。
(でもだいたいはリストをつくったほうがやりやすい)
Comparison
all.equal, identical
ふたつのオブジェクトの各要素が同じか調べる。all.equal
はだいたい同じかを調べる。identical
は完全に同じかを調べる。
どういうことだってばよ??と思ってヘルプを見ると、all.equal
にはtolerance
という引数があって、これがデフォルトだとだいたい1.5e-8
になってるらしい。これ以下だと同じとみなす。
あとall.equal
がもうひとつウザいのは、同じだったらTRUE
なので、同じじゃなかったらFALSE
を返してくると思いきや、"Mean relative difference: 1.29526e-15"
みたいな文字列で違いを報告してくる。
知らなかった。。
要は、「同じかどうか」を調べたかったらidentical
を使っとけば間違いない、と。
!=, ==, >, >=, <, <=
比較演算子。
is.na, complete.cases
欠損値があるか調べる関数。is.na
はそれぞれの要素がNA
か調べる。complete.cases
はそれぞれのレコードにひとつでも欠損値があるか調べる。
is.finite
値が有限か調べる。
Basic math
*, +, -, /, ^, %%, %/%
算術演算子。
いつも忘れるけど、%%
は割った余りを求める。%/%
は割った値を超えない最も大きな整数を返す。
ちなみに、小数でも使える。色々コーナーケースがあるらしいので過信は禁物。
3.2 %% 1.5 #> [1] 0.2 # 0.2であらわされる数は実は0.2より少し大きいから答えは4にならないといけない、でも5になる、と # ドキュメントには書いてあるけど、ちょっと何言ってるのか分からないっす。。 1 %/% 0.2 #> [1] 5
abs, sign
絶対値と符号を返す関数。sign(0)
は0
。
acos, asin, atan, atan2
逆三角関数。
sin, cos, tan
三角関数。
ceiling, floor, round, trunc, signif
値を丸めてくれる関数。trunc
はtruncating the values in x toward 0.
らしい。signif
は指定した有効数字で値を丸めてくれる(round
は桁数で丸める)
exp, log, log10, log2, sqrt
指数とか対数とか。
max, min, prod, sum
最大、最小。prod
はすべての掛け算。sum
は合計。
cummax, cummin, cumprod, cumsum, diff
累積最大、累積最小、累積の掛け算、累積合計。
diff
は差を求める。lag
引数は、いくつずらした値を比較するか。
diff(1:10, lag = 1) #> [1] 1 1 1 1 1 1 1 1 1 diff(1:10, lag = 4) #> [1] 4 4 4 4 4 4
differences
引数は、何重の差を見るか。たとえば、差の差の差を見たければdifferences=3
#> diff(cumsum(cumsum(cumsum(1:10))), differences = 3) #> [1] 4 5 6 7 8 9 10
pmax, pmin
ベクター化されたmax
, min
。
data.frame(a = 1:5, b = 5:1) %>% mutate(pmax = pmax(a, b)) #> a b pmax #> 1 1 5 5 #> 2 2 4 4 #> 3 3 3 3 #> 4 4 2 4 #> 5 5 1 5
range
値の範囲。最大と最小。
mean, median, cor, sd, var
平均、中央値、相関係数、標準偏差、分散。
rle
連長圧縮というらしい。uniq -c
と同じものだと理解した。
Functions to do with functions
function
関数。
missing
関数の引数で足りない値。
on.exit
関数から抜ける際に実行する関数を指定する。
return, invisible
値を返す。invisible
は奥が深いので割愛。
Logical & sets
&, |, !, xor
論理演算子。
all, any
すべてTRUEか。ひとつでもTRUEがあるか。
intersect, union, setdiff, setequal
集合演算。
which
要素がTRUEなインデックスを返す。
Vectors and matrices
c, matrix
c
はベクターやリストをつくる。matrix
はマトリックスをつくる。
length, dim, ncol, nrow
長さ、次元、行数、列数。
data.frame
は列方向のデータなので、length
は列数になる。行数を知りたいときはnrow
のほう。
cbind, rbind
列方向、行方向にデータを束ねる。
names, colnames, rownames
名前。
t
転置。
diag
対角行列。
sweep
これはドキュメント読んでもよく分からない...。行列版apply
みたいなもののようです。行ごとに違う値を足したりしたい、みたいな感じのことができるっぽい。
as.matrix, data.matrix
matrixに変換します。
data.matrix
はデータフレームを数値に変換します。日付とかfactorでも必ず数値になる。まあでも、自分で明示的に変換した方が間違いない予感はします。
as.matrix(data.frame(x = rep(as.Date("2015-09-09"), 3))) #> x #> [1,] "2015-09-09" #> [2,] "2015-09-09" #> [3,] "2015-09-09" data.matrix(data.frame(x = rep(as.Date("2015-09-09"), 3))) #> x #> [1,] 16687 #> [2,] 16687 #> [3,] 16687
Making vectors
c
ベクターつくるやつ。
rep, rep_len
要素を繰り返す。rep
は繰り返し回数を、rep_len
は得たい長さを指定する。
seq, seq_len, seq_along
値の並びをつくる。
rev
並び順を逆に。
sample
サンプリング。
choose, factorial, combn
場合の数、階乗、組み合わせをすべて列挙。
(is/as).(character/numeric/logical/...)
型チェック、型変換。
Lists & data.frames
list, unlist
リストをつくったり、ベクターに変換したり。
data.frame, as.data.frame
データフレームをつくる。
split
分割する。これもdplyrを使ってるとあまり意識しないかも。
expand.grid
複数の要素の組み合わせをすべて列挙。
combn
と似てるけど、combn
は同じ集合から要素を指定個数取り出すときの組み合わせで、
expand.grid
は複数の集合からひとつづつ要素を取り出すときの組み合わせ。
あと、ベクターの外積を求めるouter
というのも、同じような用途で使うこともあるみたい。参考:http://stackoverflow.com/questions/17171148/non-redundant-version-of-expand-grid
Control flow
if, &&, || (short circuiting)
条件分岐。
for, while
繰り返し。
next, break
ループを抜ける。Rはcontinue
じゃなくてnext
なので注意。
switch
スイッチ関数。
ifelse
ベクター化されたif-else構文、的な。でもけっこうつまづくので必要なとき以外は避ける。
Apply & friends
lapply, sapply, vapply
言わずと知れたApplyファミリー
apply
apply。使い方ほぼ知らないのでスルー。
tapply
これもよく知らない。ドキュメント読んだけど分からない。。
replicate
同じものを繰り返す。rep
の二次元版、的な感じ?
replicate(5, sample(letters, 2)) #> [,1] [,2] [,3] [,4] [,5] #> [1,] "x" "n" "r" "f" "p" #> [2,] "v" "r" "q" "s" "e"
Common data structures
Date time
ISOdate, ISOdatetime, strftime, strptime, date
日付。
difftime
時間差。
julian, months, quarters, weekdays
日付。
library(lubridate)
lubridate使いましょう。
Character manipulation
grep, agrep
agrep
はfuzzy matchingらしい。そんなのあったのか。
gsub
文字列置換。
strsplit
文字列分割。
chartr
文字の置き換え。たぶんこれだけはstringiより速い。
nchar
文字数。結合文字とかがまじると結果はちょっと怪しげだった気がする。
tolower, toupper
大文字小文字変換。
substr
サブストリング。
paste
文字列結合。Pythonでいう' 'join(['a', 'b', 'c'])
みたいにベクターの全要素を結合したいときはcollapse
引数を指定する。
library(stringr)
stringr使いましょう。
Factors
factor, levels, nlevels
factor型。レベル、レベル数。
reorder, relevel
reorder
はfactorのレベルを並べ替える。たとえば、個数順に並べ替えるのは下のような感じ。
set.seed(10) a <- as.factor(sample(letters[1:3], 20, replace = TRUE)) a #> [1] b a b c a a a a b b b b a b b b a a b c #> Levels: a b c reorder(a, a, FUN=length) #> [1] b a b c a a a a b b b b a b b b a a b c #> attr(,"scores") #> a b c #> 8 10 2 #> Levels: c a b
relevel
は、指定したレベルを一番上に並べ替える。
cut, findInterval
cut
は、あらかじめ分割した区間に値を分類する。findInterval
はそれの数値版、みたいな感じ?
cut
はデフォルトだと指定した区間の外側はNAになってしまうのが違う。
cut(1:15, breaks = c(2, 5, 14)) #> [1] <NA> <NA> (2,5] (2,5] (2,5] (5,14] (5,14] (5,14] #> [9] (5,14] (5,14] (5,14] (5,14] (5,14] (5,14] <NA> #> Levels: (2,5] (5,14] findInterval(1:15, vec = c(2, 5, 14)) #> [1] 0 1 1 1 2 2 2 2 2 2 2 2 2 3 3
interaction
2つのfactorの全組み合わせのfactorをつくる。使いどころが...
options(stringsAsFactors = FALSE)
おまじない。
Array manipulation
array
n次元の行列。matrix
は2次元だけど、array
は何次元でもいい。
dim
次元。
dimnames
次元名。
aperm
転置。マトリクスでいうt
みたいなもの。
library(abind)
array関連の関数が色々あるらしい。知らなかった。
Statistics
Ordering and tabulating
duplicated, unique
duplicated
は、先頭から値を見ていって、それ以前に同じ値があればTRUE
、なければFASLE
を返す。unique
は重複を排除した全要素を返す。
duplicated(c(1,1,2,2,2,3)) #> [1] FALSE TRUE FALSE TRUE TRUE FALSE
merge
data.frameのjoin的なもの。
order, rank, quantile
order
は並べ替えた要素のインデックスを返す。rank
はランクをつける、quantile
は四分位点を求める。
sort
並べ替え
table, ftable
集計。ftable
はデータフレーム用のtable
みたいな感じらしいけど、めっちゃ便利そうな。なにこれすごい...
ftable(mtcars[c("cyl", "vs", "am", "gear")]) #> gear 3 4 5 #> cyl vs am #> 4 0 0 0 0 0 #> 1 0 0 1 #> 1 0 1 2 0 #> 1 0 6 1 #> 6 0 0 0 0 0 #> 1 0 2 1 #> 1 0 2 2 0 #> 1 0 0 0 #> 8 0 0 12 0 0 #> 1 0 0 2 #> 1 0 0 0 0 #> 1 0 0 0
Linear models
(このへん正しい用語がよく分からないので飛ばします...。勉強足りなくてすみません)
fitted, predict, resid, rstandard
モデルからフィットさせた値とか予測値とかを取り出す関数。
lm, glm
hat, influence.measures
ドキュメントには
The function
hat()
exists mainly for S (version 2) compatibility; we recommend usinghatvalues()
instead.
と書いてあるけど...
logLik, df, deviance
formula, ~, I
I
が何なのか、理解が怪しい。
anova, coef, confint, vcov
contrasts
Miscellaneous tests
apropos("\\.test$")
XXXX.test
って関数いろいろありますよね。
Random variables
(q, p, d, r) * (beta, binom, cauchy, chisq, exp, f, gamma, geom, hyper, lnorm, logis, multinom, nbinom, norm, pois, signrank, t, unif, weibull, wilcox, birthday, tukey)
ランダム値を生成する関数。いっぱいありますね(小並感)
Matrix algebra
crossprod, tcrossprod
内積。
eigen, qr, svd
%*%, %o%, outer
%*%
は行列の掛け算。%o%
,outer
は外積。
rcond
条件数
solve
solve(a, b)
とやると、a %*% x = b
という式をx
について解く。
Working with R
Workspace
ls, exists, rm
オブジェクトの一覧、存在するかチェック、削除。
getwd, setwd
カレントディレクトリの取得、設定。
q
セッションを終わる。
source
Rのコードを実行する。
install.packages, library, require
パッケージをインストール、読み込み。
Help
help, ?
ヘルプ
help.search
ヘルプを探す。
apropos
オブジェクトを探す
RSiteSearch
Rのサイトを検索。...って何だこのサイトは。こんなのあるの知らなかったー。
citation
RとかRのパッケージをリファレンスに載せるときの表記を出力してくれる。
demo
デモ
example
例
vignette
Vignette
Debugging
このへんはRStudioつかってると生で触る機会はないかも。
traceback
スタックトレースを出力
browser
デバッグ時に使うやつ。
recover
options(error = )
options(error = recover)
ってやっとくと、エラーが出た時にbrowserが立ち上がるのかな?
stop, warning, message
エラーを投げたり警告を出したりメッセージを出したり。
tryCatch, try
エラーをキャッチ。
I/O
Output
print, cat
出力。cat
はファイルに出力したりもできる(ただしエンコーディングは指定できない)
message, warning
メッセージとか警告を出す。
dput
オブジェクトをファイルに書き出す。dget()
すると同じオブジェクトを復元できる。
format
出力するときのフォーマット
sink, capture.output
Rの出力をファイルに出したり変数に入れたりできる。
Reading and writing data
data
データセットの読み込み。
count.fields
フィールド数がいくつあるか。read.csv
する前に調べたいときとか使うのかな。
read.csv, write.csv
read.delim, write.delim
read.fwf
CSVとかTSVとかのデータを読んだり書いたり。
readLines, writeLines
文字列を読んだり書いたり。
readRDS, saveRDS
オブジェクトをシリアライズして保存、読み込み。
load, save
データを保存、読み出し。
library(foreign)
R以外からのデータを読み込むパッケージ。
Files and directories
dir
ファイル一覧
basename, dirname, tools::file_ext
ディレクトリ名、ファイル名、拡張子。
file.path
パスを連結する。
path.expand, normalizePath
パスを解釈する。
file.choose
ファイルを選ぶウィンドウが出る。これRStudio Server出も動くのかな?
file.copy, file.create, file.remove, file.rename, dir.create
ファイルとかディレクトリをつくったり消したり。
file.exists, file.info
ファイルの存在、情報を調べる。
tempdir, tempfile
一時ファイル。
download.file, library(downloader)
ファイルをダウンロードする。
感想
疲れた…。小手先でRを使ってるのでモデル関連のところは案の定理解が及びません。あと、行列とかも。
勉強が足りないな、と思いました。