- 追加された行はこの色です。
- 削除された行はこの色です。
- 定石集 は削除されています。
- 定石集 の差分を削除
COLOR(red){SIZE(25){R プログラミング 定石集}}
R でプログラミングする際役に立つと思われる「定石」を脈絡無く集めます。
#contents
~
*調整累積度数
ある階級未満の累積度数と当該階級の半分の和を累積度数とする。for を使わないバージョン
> ob <- c(4,1,2,12,97)
> oc <- ob
> for (i in 1:length(ob)) { oc[i] <- sum(ob[1:i])-ob[i]/2 }
> oc
[1] 2.0 4.5 6.0 13.0 67.5
> oc <- cumsum(c(0, ob[-length(ob)]))+ob/2
> oc
[1] 2.0 4.5 6.0 13.0 67.5
*テキスト出力をグラフィックに描画
行間隔は画面の高さを調整することで対処(みんな同じことを考えるようだ)
plot.texts <- function(out)
{
nr <- length(out)
nl <- max(sapply(out, nchar))
plot(c(0, nl), c(0, -nr), type="n", xaxt="n", yaxt="n", xlab="", ylab="", bty="n")
text(rep(0, nr), 0:(-nr), out, pos=4)
}
x <- rnorm(20)
plot.texts(capture.output(stem(x)))
#ref(out1.png)
> plot.texts(capture.output(t.test(1:5, c(3,2,5,6))))
#ref(out2.png)
*α±βのような形式の二値を計算するとき
αやβが長いときそれぞれ前もって変数に付値しておいてから,α+β,α-βとして二変数に結果を付値しても良いが,要素を2つ持つベクトルに付値するという手もある
二次方程式の解を求める(以下のように公式をそのまんま適用するのは好ましくはないが)
# a*x^2+b*x+c=0 の解
> a <- 2
> b <- 3
> c <- -2
> x1 <- (-b+sqrt(b^2-4*a*c))/(2*a)
> x2 <- (-b-sqrt(b^2-4*a*c))/(2*a)
> x1;x2
[1] 0.5
[1] -2
> x <- (-b+c(-1,1)*sqrt(b^2-4*a*c))/(2*a)
> x
[1] -2.0 0.5
*[i] はベクトルオブジェクトなら使える
a <- c(3,2,5,4) としてから a[i] のようにしなくても,c(3,2,5,4)[3] のように使える
> lines(x, y[,1], lty=1, col="green")
> lines(x, y[,2], lty=2, col="blue")
> lines(x, y[,3], lty=2, col="red")
の3行を,わかりやすいかどうかは別として
> sapply(1:3, lines(x, y[,i], lty=c(1,2,2)[i], col=c("green", "blue", "red")[i]))
のようにも使える
*ベクトル演算を有効利用する
n <- 10
p <- numeric(n+1)
for (i in 0:n) {
p[i+1] <- choose(n,i)*(0.2^i)*(0.8^(n-i))
}
以下のように
n <- 10
i <- 0:n
p <- choose(n,i)*(0.2^i)*(0.8^(n-i))
*フィッシャーのZ変換とその逆変換
統計学の教科書では log と exp を使った公式が書いてあるが,コンピュータでは数学関数1つで簡単に求めることができる
# フィッシャーのZ変換
> Fisher.trans <- function(r) 0.5*log((1+r)/(1-r))
> z1 <- Fisher.trans(0.5)
> z2 <- atanh(0.5)
> cat(z1, z2)
0.5493061 0.5493061
# フィッシャーのZ変換の逆
> Fisher.trans.inv <- function(z) (exp(2*z)-1)/(exp(2*z)+1)
> r1 <- Fisher.trans.inv(z1)
> r2 <- tanh(z1)
> cat(r1, r2)
0.5 0.5