組み込み関数

データ操作によく使う関数。これもそのうちまとめる。

数値操作関数

Function Description
abs(x) 絶対値
abs(-100)
sqrt(x) 平方根
sqrt(100)
ceiling(x) 切り上げ
ceiling(3.475) is 4
floor(x) 切り捨て
floor(3.475) is 3
trunc(x) 整数部だけ取り出し
trunc(5.99) is 5
round(x, digits=n) IEEE式の四捨五入
round(3.475, digits=2) is 3.48
signif(x, digits=n) xを有効数字n桁で表示
signif(3.475, digits=2) is 3.5
cos(x), sin(x), tan(x) サイン、コサイン、タンジェント
角度 (ラジアン) を求めるには acos(x), cosh(x), acosh(x)。三角関数
# 角度を与えてサインコサインタンジェントを得るにはaspaceパッケージの関数を使う
library(aspace)
sin_d(), cos_d, tan_d()
log(x) 自然対数。ExcelではLOG()が常用対数。
log(1000)
log10(x) 常用対数
log10(1000)
exp(x) 指数
log(1000); exp(log(1000))

文字列操作関数

Function Description
substr(x, start=n1, stop=n2) 文字列の抽出と置換
x <- "abcdef"
substr(x, 2, 4) is "bcd"
substr(x, 2, 4) <- "22222" is "a222ef"
grep(pattern, x, ignore.case=FALSE, fixed=FALSE) オブジェクト内の文字列を検索し、patternに一致するxの位置を返す。fixed =FALSE とすると正規表現で検索する。 fixed=TRUE thenの場合、文字列として検索する。一致した文字列の添え字を返す。.
grep("A", c("b","A","c"), fixed=TRUE) returns 2
応用例
sub(pattern,replacement,x, ignore.case =FALSE, fixed=FALSE) 文字列を置換する。
a <- "s000"
sub("s", "X", a)
文字列を除去することもできる
sub("s", "", a)
gsub(pattern,replacement,x, ignore.case =FALSE, fixed=FALSE) 文字列を置換する。subと違って複数を一括置換できる。
a <- "s00s0"
sub("s", "X", a) # 最初の文字しか置換されない。
gsub("s", "X", a)
strsplit(x,split) 文字列を分割する。区切りはsplitで指定する。。結果がリストとして返されることに注意。
strsplit("abc", "")
strsplit("abc", "b")
# リストとして返さず、ベクトルとして返す。以下2つは同じ結果
strsplit("abc", "_")[[1]]
unlist(strsplit("abc", "_"))
paste(..., sep="") 文字列を結合する。sep で区切りを指定する。
paste("x",1:3,sep="")
paste("x",1:3,sep="M")
paste("Today is", date())
# ベクトルの要素を結合する。collapseオプションを使う。
nms <- names(iris) # irisデータの変数名
paste(nms, collapse=",") # コンマ区切り
paste(nms, collapse=" ") # スペース区切り
toupper(x) 大文字にする
toupper("abc")
tolower(x) 小文字にする
tolower("ABC")
abbreviate(x) Rが"適当に"文字列を短くする。
names(iris)
abbreviate(names(iris))
nchar(x) 1つの要素の文字数を数える。
nchar("s000")
cat(x) 文字列を出力
cat(letters, sep=",") # 小文字をコンマ区切りで出力
cat(letters, sep="\n") # 小文字を改行してで出力

正規表現とは文字列の特徴をパターン化し、特別の記号で表現したもの。検索や置換をパターンで行える。たとえば、
  2011/04/05
  -> "数字スラッシュ数字スラッシュ数字" というパターン
  -> 正規表現であらわすと「\d+/\d+/\d+」となる。
という説明がわかりやすかった。
Rjpwiki: Rにおける正規表現
他正規表現リンク Rjpwiki: Rにおける正規表現

確率統計の関数

確率分布に関連した関数。乱数生成で set.seed(1234) (他の数字でもよい) とすると同じ乱数を生成できる。Rjpwikiの記事のほうがわかりやすいのはいうまでもない。Rにおける確率分布

Function Description
dnorm(x) 平均0、標準偏差1 (m=0, sd=1) の正規分布密度関数。
# 正規曲線のプロット
x <- pretty(c(-3,3), 30)
y <- dnorm(x)
plot(x, y, type='l', xlab="Normal Deviate", ylab="Density", yaxs="i")
pnorm(q) クォンタイル値に対する累積確率。よく片側で0.975とかになるアレ。クォンタイル値から下 (左) の確率を出力。
pnorm(1.96) is 0.975
qnorm(p) 確率値 (パーセンタイル) 正規分布のクォンタイル値。
qnorm(.975) is 1.959964
rnorm(n, m=0,sd=1) 平均と標準偏差を指定し、正規分布による乱数を生成する。
x <- rnorm(50, m=50, sd=10) # 平均50、標準偏差10の乱数を50個生成
dbinom(x, size, prob)
pbinom(
q,size,prob)
qbinom(
p,size,prob)
rbinom(
n, size, prob)
二項分布関数。sizeはサンプルサイズ、probは確率を指定。
コインを10回投げて (size=10) 、表が出る (prob=0.5) 回数 (1回も表が出ない、1回表が出る、2回出る...5回出る: x=1:5) を求める。
 dbinom(0:5, 10, .5)
コインを10回投げて "少なくとも" 5回は表が出る確率
 pbinom(5, 10, .5)
 sum(dbinom(0:5, 10, .5)) # これも同じ
dpois(x,lamda)
ppois(
q,lamda)
qpois(
p,lamda)
rpois(
n,lamda)
ポアソン分布
poisson distribution with m=std=lamda
#probability of 0,1, or 2 events with lamda=4
dpois(0:2, 4)
# probability of at least 3 events with lamda=4
1- ppois(2,4)
dunif(x, min=0, max=1)
punif(
q, min=0, max=1)
qunif(
p, min=0, max=1)
runif(
n, min=0, max=1)
一様分布。
runif(10)

覚書

  • d... distribution。分布関数曲線の数式。確率密度関数のこと
  • p... percentile 。特定のポイントでの面積 (積分) 。よく斜線が引いてあるアレ
  • q... quantile。ある確率密度のときの横軸 (標準得点の値) 。よく1.96とか使われるアレ
  • r... random。特定の分布に基づいて乱数を発生させる (例えば正規分布に基づく乱数だと、平均0、標準偏差1になる)

正規分布曲線

x <- seq(-4, 4, 0.01) # 最小値-4, 最大値4、0.01刻みのベクトル
curve(dnorm(x, 0, 1), -4, 4) # ベクトルxについて、平均0、標準偏差1の曲線を描く


他の統計関数

na.rmで欠損値の扱いを指定する。結果はベクトルやデータフレーム、あるいはスカラで返される。R-tipsの59. 基本統計量の算出のほうがわかりやすい。

Function Description
mean(x, trim=0,
na.rm=
FALSE)
算術平均
# trim=0.5でデータの上下5%をカットしたトリム平均を算出する。
mx <- mean(x,trim=.05,na.rm=TRUE)
sd(x) 不偏標準偏差。不偏分散はvar(x) 、中央絶対偏差 (median absolute deviation) はmad(x)
median(x) 中央値
quantile(x,probs) 分位数。データを並べて、その数を1対3とか、1対1に区切る値のこと。1対1に区切る値は中央値に同じ。
x <- c(0.7,-1.6,-0.2,-1.2,-0.1,3.4,3.7,0.8,0.0,2.0)
quantile(x)
range(x) 範囲
sum(x) 合計
diff(x, lag=1) ラグつき階差
min(x) 最小値
max(x) 最大値
scale(x, center=TRUE, scale=TRUE) 中心化 or 標準化。center=T, scale=Fで標準化。

他の便利な関数

Function Description
seq(from , to, by) 等差数列の生成
seq(1,10,2)
rep(x,ntimes) 要素の反復
rep(1:3, times = 3) # 1,2,3を3回繰り返す。rep(1:3, 3) も同じ
rep(1:3, each = 3) # それぞれを3回くりかえす
## 繰り返しは要素ごとに指定もできる
rep(1:3, times = c(3, 2, 5))
cut(x, n) 連続変数をn個の水準をもった因子変数にする。
cut(1:10,5) # 1以上5以下と5より大きく10以下の2水準。水準名はわかりづらい。

他の便利な関数2

# 最頻値
# 例示用ベクトル
xn <- sample(1:100, 1000, replace=T)
xf <- factor(sample(letters[1:5], 1000, replace=T))

# 数値変数の場合
x <- xn
hist(x, plot=F, right=F)$breaks[order(hist(x, plot=F, right=F)$counts, decreasing=T)][1] # 最頻値出力
# 確認用
hist(xn, plot=F)

# 因子変数の場合
x <- xf
names(table(x))[order(as.vector(table(x)), decreasing=T)][1] # 最頻値出力
# 確認用
table(xf)


## 因子変数を指定した数だけ複数つくる
gl(n=3, k=20, labels=c("control", "treatmentA", "treatmentB")) # ordered=Tで順序尺度に


# ランダムサンプリング sample
sample(x=ベクトル, size=総数, replace=F:同じ要素が選ばれても良いか, prob=NULL:確率ベクトル
## 5件法のデータを100個生成する
sample(x=5, size=100, replace=T)
## prob引数。確率ベクトルとして3が半分とかのデータにする。デフォルトは一様
p <- c(0.1, 0.1, 0.5, 0.1, 0.2)
table(sample(x=5, size=100, replace=T, prob=p)) # tableで集計


## 正規分布っぽい乱数生成
# msmパッケージのptnorm関数を使用して上限と下限を設定した正規分布をつくり、それを5等分して各確率密度を求め, pr.vに入れる
pr.v <- vector("numeric", 5)
library(msm)
for (i in 1:5) {
pr.v[i] <- ptnorm(q=i+1, mean=3.5, sd=1, lower=1, upper=6) - ptnorm(q=i, mean=3.5, sd=1, lower=1, upper=6)
}
pr.v
## pr.vに従って1-5までの乱数を生成する
x <- sample(1:5, 10000, replace=T, prob=pr.v)
table(x)


# 組み合わせ関数 combn, choose
5水準の要因で、2水準ごとの組み合わせ
x <- gl(5, 20) # 各サンプルサイズは20とする。特に意味はない
x.lvl <- levels(x)
combn(x.lvl, 2)
# 何通りあるか
x.nm <- nlevels(x)
choose(x.nm, 2)
# 複数の因子の交互作用的な組み合わせ?
y <- gl(3, 20, labels=c("a", "b", "c"))
interaction(x, y)
## 組み合わせの種類
levels(interaction(x, y))

# ファイル・ディレクトリを R から操作する低水準インタフェイス関数群
dir(...) # ディレクトリ内のファイル名を列挙
file.create(...) # ファイルを新規作成
file.exists(...) # ファイルが存在するかどうかチェック
file.remove(...) # ファイルを削除
file.rename(from, to) # ファイル名を変更
file.append(file1, file2) # ファイルを合併
file.copy(from, to, overwrite = FALSE) # ファイルをコピー
file.symlink(from, to) # シンボリックリンク
dir.create(path, showWarnings = TRUE) # 新規ディレクトリを作成


# ベクトル、オブジェクトの一致判断
x<-1:10
y<-x # 同じもの
y10<-c(1:9,100)#最後だけ違う
y01<-c(100,2:10)#最初だけ違う

# 基本的に等号演算子で確認できる
x==y
x==y10
x==y01
## 同じなのはいくつかカウント
sum(x==y)
sum(x==y10)

#とりあえず同じかどうか調べる
identical(x,y10)#ベクトルだけではなくオブジェクトもわかる
#yの中にxのどの要素があるか調べる。yの中にあるxの要素を返し、そうでないものはNA。excelでいうとcountifみたいなものか
match(x,y10)
#countif的にマッチするものの数を数える。回答と正答を照合して正答の個数を数えたりするときに使う。
# x=回答、y10=正答 (解答) とする。 sum(complete.cases(match(x,y10)))

# どこが同じ調べる。要素の位置 (添え字) を返す
xx <- c(11:20, 1:10)
yy <- c(11:20, 101:110)
which(xx==yy) # 要素の1番目から10番目まで同じ

上記の関数は多くの場合ベクトルや行列に適用可能。
RプログラミングTips大全