読者です 読者をやめる 読者になる 読者になる

Advanced Rを読んで知ったこと(3) 基本的な関数いろいろ。

R Advanced R

Advanced Rには「Vocabulary」という章があります。

Vocab · Advanced R.

特に解説はしないけど、これくらいは知っとけ、と。

神・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

[はアトミックなベクターやリスト、データフレームのサブセットをつくる関数。

[[$はリストの要素を取り出す関数。ちなみに、$は部分一致で動くらしい。知らなかった。。

headtailは、それぞれはじめと終わりの一部分だけのサブセットをつくる関数。

subsetは、データフレームやリストの与えた条件を満たす要素だけのサブセットをつくる関数。Hadleyはこれ嫌いらしくてぶつぶつ言ってたのを見かけた記憶がある。

with

with(data, expr, ...)という形で、dataattachした環境で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

値を丸めてくれる関数。trunctruncating 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 using hatvalues() 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について解く。

bは省略すると単位行列とみなされ、a逆行列が返ってくる。

Working with R

Workspace

ls, exists, rm

オブジェクトの一覧、存在するかチェック、削除。

getwd, setwd

カレントディレクトリの取得、設定。

q

セッションを終わる。

source

Rのコードを実行する。

install.packages, library, require

パッケージをインストール、読み込み。

Help

help, ?

ヘルプ

help.search

ヘルプを探す。

apropos

オブジェクトを探す

RSiteSearch

Rのサイトを検索。...って何だこのサイトは。こんなのあるの知らなかったー。

http://search.r-project.org/

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を使ってるのでモデル関連のところは案の定理解が及びません。あと、行列とかも。

勉強が足りないな、と思いました。