Tips/山椒Tips集
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
COLOR(red){SIZE(30){山椒 Tips 集}}
初心者の悩みを解決する、小粒だけれどピリリと効く Tips 集...
#contents
*作業ディレクトリの確認・変更 [#xebbba2a]
ファイル入出力時などに必要かも
getwd() #作業ディレクトリの確認
setwd("指定する作業ディレクトリ") #作業ディレクトリの変更
*出力 [#i6012af6]
**有効数字桁数の変更 [#n7fba2b1]
表示される有効桁数を変える。内部演算桁数は変更されず。最...
options(digits=10) # 表示桁数を10桁に変える
**書式つき出力 [#i68cec21]
> options(scipen=10)
> p <- 0.0001
> p
[1] 0.0001
>formatC(p)
[1] "0.0001"
*ヘルプ [#te0871cc]
**関数の説明を見る [#d46dc33e]
関数 foo の説明と参考例コードを見る
help(foor)
?foo # 簡略形
予め COLOR(red){help.start()} を一度実行すると、それ以降...
**関数の参考例デモを見る [#i461f4dc]
COLOR(red){help()} で表示される、各関数の説明の最後には参...
example(lm) # 関数 lm の参考デモを見る
*Rを電卓のかわりに使う [#k97e5aef]
> sum(1,2,3,4)
[1] 10 #よしよし
> mean(1,2,3,4)
[1] 1 #あれ?
> mean(c(1,2,3,4))
[1] 2.5 #これが正解
Rの関数はコンマのあとは引数。
sum() などは、引数はベクトル要素と見なしてくれるので、上...
でも、mean() など、ベクトル演算の関数を使うときは、手抜き...
*グラフィックス [#te3e4724]
**グラフィックス出力を段階的に行なう [#s470781a]
次のグラフィックス出力の前に確認プロンプトがでる。特に CO...
par(ask=TRUE)
par(ask=FALSE) # 元に戻す
**グラフィックスオプションの退避・復帰 [#xad9542b]
グラフィックスのオプションパラメータを一時変更した後で、...
oldpar <- par(no.readonly = TRUE) # 現在の変更可...
(パラメータオプションの変更を伴う作業)
par(oldpar) ...
foo <- function ( ) {
oldpar <- par(no.readonly = TRUE)
(パラメータオプションの変更を伴う作業)
on.exit(par(oldpar)) #...
}
**ポストスクリプト出力が横向きになる [#w13f5b0a]
オプション COLOR(red){horizontal=FALSE} を使う。
postscript("foo.eps", horizontal=FALSE, height=9, widt...
(ポストスクリトへの出力)
dev.off() # デバイスを閉じる
**ポストスクリプトファイルが壊れる [#t0e3aea1]
出力が全部終ったら、すかさず COLOR(red){dev.off()} でデバ...
postscript("foo.eps", horizontal=FALSE, height=9, widt...
(ポストスクリトへの出力)
dev.off() # デバイスを閉じる
*プログラミング [#ef2cc354]
** R の組み込み関数の再定義にご注意 [#o38b529d]
R の組み込み関数、オブジェクトはCOLOR(magenta){自由に再定...
> "+" <- function (x) x # 過激な例
> +(1) # これが正しく意味を持つ
[1] 1
> 2+3 # + は二項演算子の意味を失っている
Error in 2 + 3 : unused argument(s) ( ...)
このような事態になったときの対処法は,再定義したオブジェ...
> ls() 今定義されているオブジェクトのリストを見る
[1] "+" その他いろいろのオブジェクト
> rm("+") "+" オブジェクトを取り除く!
> 3+4
[1] 7 なおった!
**コード中のコメント [#y2886d00]
コード中に # を置くと、それ以降行末までコメントとして無視...
foo <- function (x) {
x <- 0 # 変数 x に値 1 を代入する (本来のコメント)
# x <- 2 # コメントアウトされた一行
if(0){ # 複数行一括コメント化
(コメントアウトされた複数行)
}
)
**for文を書きましたが結果が出ません [#k3140a19]
> for(i in 1:3){2^i}
>
ブロック{ }内の結果を表示するには、print() や cat() が必...
> for(i in 1:3){print(2^i)}
[1] 2
[1] 4
[1] 8
**プログラムの実行を一時中断する [#yb4dcc73]
何かキー入力があるまでプログラムの実行を停止
> foo <- function(x) {
cat("sum of x is -->", sum(x), "?n")
readline("Can I proceed? ")
cat("prod of x is -->", prod(x),"?n") }
> temp(1:4)
sum of x is --> 10
Can I proceed? #ここで何かをキー入力すると次を実行
prod of x is --> 24
**プログラムの実行中に対話的に数値を入力する [#g120a85a]
COLOR(red){readline()} は入力した値を取り込むのにも使える
> foo <- function () {
x <- readline("Input some number ---> ") # 入力値...
cat(" Inputted number = ", x, "?n")
return(as.numeric(x))} # 入力された文字列化された...
> foo()
Input some number ---> 2.3
Inputted number = 2.3
[1] 2.3
**条件分岐 [#ob9a75d4]
普通の if 文 (条件についてベクトル化されていない)
if (x) A
if (x==0) A else B
if (x==0) A else if (x==1) B else C
二者択一 (条件についてベクトル化されている)
ifelse(x==0, A, B)
ifelse(x==0, A, ifelse(x==1, B, C) )
**付値演算子 [#g91eaf9e]
R の付値演算子 COLOR(red){<-}, COLOR(red){->}, COLOR(red)...
lm.D9 <- lm(weight ~ group) # 線形回帰の結果をオブジェ...
anova(lm.D9) # オブジェクトを anova 関数で処理
これを一行で書くと
anova(lm.D9 <- lm(weight ~ group)) # 線形回帰の結果をオ...
こんなこともできる
x <- y <- 10 # x <- (y <- 10) つまり assign(x, assign(y...
R のすべての関数・演算子は原則として何らかの値を返すよう...
**効率的な編集 [#l4adbe61]
関数(データ)の効率的な編集をするには、
-二つのウィンドを開き、一方で R を起動する
-もう一方のウィンドで適当なエディタでファイル("bar.R" と...
-R 起動中のウィンドで、ファイルを COLOR(red){source("bar....
-このプロセスを繰り返す
-COLOR(red){source("bar.R")} を何度も R のプロンプトに打...
sr <- function() source("bar.R")
-適当なエディタウインドウを開き,エディタでプログラムやデ...
**オプション入力の省略(省力) [#q0d476f2]
オプションをフルに書かなくてもいいケースがあります。イー...
mean(c(1, NA, 3), na.rm =TRUE) # NA を取り除いて平均を...
mean(c(1, NA, 3), na.rm =T)
mean(c(1, NA, 3), n=T)
mean(c(1, NA, 3), na.r=TRUE)
[1] 2
いずれも同じ結果を返します。
**R でプログレスバー([[参考サイト:http://www.programmingr...
pb <- winProgressBar(title="プログレスバーの例", label="...
for(i in 1:100) {
Sys.sleep(0.1) # slow down the code for illustration p...
info <- sprintf("%d%% 完了", round((i/100)*100))
setWinProgressBar(pb, i/(100)*100, label=info)
}
*ベクトル [#u229f3dd]
**ベクトルの一部を取り出す [#mf2057ab]
> x <- c(1,2,3,4,5,6,7,8,9) # x <- 1:9 でも良い
> x[2:5] # x[2], x[3], ..., x[5] を取り出す...
[1] 2 3 4 5
> x[-2:5] # x[2], x[3], ..., x[5] 以外を取り...
[1] 1 6 7 8 9
> y <- x%%3==0
> y
[1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE
> x[y] # 論理値ベクトル指定、x[x%%3==0] で...
[1] 3 6 9
**ベクトルの要素がある条件を満たすような添字を取り出す [#...
> x <- runif(10)
> y <- which(x < 0.5) # 0.5 未満以の値を持つ要素の添字...
> y
[1] 3 5 6 10
> x[y] # 0.5 未満以の値を持つ要...
[1] 0.40643515 0.26432576 0.35265039 0.08640936
> (1:length(x))[x < 0.5] # 同じことを少し複雑に行なう
[1] 3 5 6 10
**(規則的な)ベクトルを作る [#f69f5d28]
-COLOR(red){a:b} # a から始ま...
-COLOR(red){seq(a, b, by = c)} # a から始まり(b ...
-COLOR(red){seq(a, b, length = n)} # a, b 間を n 等分す...
-COLOR(red){seq(along = x)} # 1:length(x)
-COLOR(red){rep(x, n)} # x を n 回繰...
-COLOR(red){numeric(n)} # 0 を n 個並べ...
> x <- runif(100) # 一様疑似乱数 100 個からなるベクト...
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
> 10:1
[1] 10 9 8 7 6 5 4 3 2 1
> (-1):5
[1] -1 0 1 2 3 4 5
> (-1):(-5)
[1] -1 -2 -3 -4 -5
> 1.3:10
[1] 1.3 2.3 3.3 4.3 5.3 6.3 7.3 8.3 9.3
> (-1.3):10
[1] -1.3 -0.3 0.7 1.7 2.7 3.7 4.7 5.7 6.7 7.7 ...
> (1:10)/10
[1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(0, 1, length = 11) # 0 と 1 の間を 11等分する等...
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(1, 9, by = 2) 公差 2 の等差数列
[1] 1 3 5 7 9
> seq(1, 9, by = pi)
[1] 1.000000 4.141593 7.283185
> seq(1, 6, by = 3)
[1] 1 4
> seq(17) # 1:17 と同じ
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
> x= c("a", "b", "c", "d", "e", "f")
> seq(along = x) # 1:length(x)
[1] 1 2 3 4 5 6
> rep(0,10)
[1] 0 0 0 0 0 0 0 0 0 0
> rep(1:2,10)
[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
> x <- numeric(10)
> x
[1] 0 0 0 0 0 0 0 0 0 0
**同じ数を繰り返すベクトル(2005/02/02) [#ye9cbdd5]
度数分布表のようなものから元のデータを再現するときなどに
x <- c(rep(100, 5), rep(101,8), rep(102,13), ..., rep(18...
とするのは大変。
x <- rep(100:180, c(5,8,13, ..., 3))
のようにすると簡単。~
繰り返される数値が等差数列なら,
x <- rep(n:m*k+i, c(5, 8, 13, ..., 3))
とか,特に規則性がないときでも,
x <- rep(c(a,b,c,d,...), c(x,y,z,u, ...))
とか。~
繰り返しも二通りある。どちらでもいい場合もあるし,どちら...
> rep(1:3, 4)
[1] 1 2 3 1 2 3 1 2 3 1 2 3
> rep(1:3, each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3
*因子 [#b40a5b3e]
**因子オブジェクトを作る [#m96ce538]
> x <- factor(c("s","t","a","t","i","s","t","i","c","s")...
> x
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
**存在していない level を消去する [#a8c9e343]
> x
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> factor(x) # x[, drop=TRUE] でも同じ
[1] s t a t i s t i c s
Levels: a c i s t
*リスト [#ea2cc26d]
**入れ子状のリストを作る(その1) [#xc9527b9]
> data(iris)
> sp <- unique(iris$Species)
> nested.list <- list()
> for(i in 1:length(sp)){
> nested.list[i] <- list(subset(iris, Species==sp[i]))
> }
> summary( nested.list[[1]])
Sepal.Length Sepal.Width Petal.Length Petal.W...
Min. :4.300 Min. :2.300 Min. :1.000 Min. :...
1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:...
Median :5.000 Median :3.400 Median :1.500 Median :...
Mean :5.006 Mean :3.428 Mean :1.462 Mean :...
3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:...
Max. :5.800 Max. :4.400 Max. :1.900 Max. :...
**入れ子状のリストを作る(その2) [#tb1c89ba]
> data(warpbreaks)
> wl <- unique(warpbreaks$wool)
> tn <- unique(warpbreaks$tension)
> nested.list <- list()
> for(i in 1:length(wl)){
> nested.tmp <- list()
> for(j in 1:length(tn)){
> nested.tmp[j] <- list(subset(warpbreaks, wool=...
> }
> nested.list[i] <- list(nested.tmp)
> }
> nested.list[[1]][[2]]
breaks wool tension
10 18 A M
11 21 A M
12 29 A M
13 17 A M
14 12 A M
15 18 A M
16 35 A M
17 30 A M
18 36 A M
*行列 [#j0835429]
**対角行列を作る [#j43478f2]
> diag(1, ncol=3, nrow=3) # 値 1 がリサイクル使用される
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> diag(rep(1, 3)) # diag(c(1,1,1)) と同じ
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> x <- matrix(0, ncol=3, nrow=3) # 全成分が 0 の行列
> diag(x) <- 1 # 対角成分...
> x
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> diag(x) <- c(1, 2, 3) # 対角成分を ...
> x # diag(1:3) ...
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
**行列の添字操作 [#f93e6c48]
> x <- matrix(runif(9), ncol=3, nrow=3)
> x
[,1] [,2] [,3]
[1,] 0.8296189 0.9144157 0.60020004
[2,] 0.9440765 0.5413652 0.03560994
[3,] 0.0623679 0.6051179 0.57717385
> x[1, 3] # (1,3)成分
[1] 0.6002
> x[, 3] # 第3列 (ベクトルになる)
[1] 0.60020004 0.03560994 0.57717385
> x[1,] # 第1列 (ベクトルになる)
[1] 0.8296189 0.9144157 0.6002000
> x[, 3, drop=FALSE] #第3列 (3x1 行列になる)
[,1]
[1,] 0.60020004
[2,] 0.03560994
[3,] 0.57717385
> x[1, , drop=FALSE] # 第1行 (1x3行列になる)
[,1] [,2] [,3]
[1,] 0.8296189 0.9144157 0.6002
> x[c(1,2), c(3,2)] # 2x2副行列の取り出し、c(3,2)の順序...
[,1] [,2]
[1,] 0.60020004 0.9144157
[2,] 0.03560994 0.5413652
> x[-1,] # 第2,3行からなる2x3行列
[,1] [,2] [,3]
[1,] 0.9440765 0.5413652 0.03560994
[2,] 0.0623679 0.6051179 0.57717385
> x[x >= 0.5] # 0.5より大きな成分は?
[1] 0.8296189 0.9440765 0.9144157 0.5413652 0.6051179 0....
> x[x >= 0.5] <- 0 # 0.5より大きな成分を0に置き換え
> x
[,1] [,2] [,3]
[1,] 0.0000000 0 0.00000000
[2,] 0.0000000 0 0.03560994
[3,] 0.0623679 0 0.00000000
> i <- which(x != 0) # 0でない成分の添字
> i # xをベクトルと考えた時の...
[1] 3 8
> x[i] # x[x != 0] と同じ
[1] 0.06236790 0.03560994
> which(x != 0, arr.ind=T) # 0でない添字を行列として取...
row col
[1,] 3 1 # つまり x[3,1]=0...
[2,] 2 3
COLOR(red){注意!} ベクトルや行列にNAが入っている場合は、...
入力
x<-c(1,2,NA)
x[x==1]
x[which(x==1)]
結果
> x<-c(1,2,NA)
> x[x==1]
[1] 1 NA
> x[which(x==1)]
[1] 1
*オブジェクト [#q3db0073]
**空のオブジェクトを作る [#pe17adbe]
スカラー、ベクトル、リストオブジェクトを初期化するさい、...
-COLOR(red){numeric(0)} # 空の数値ベクトル
-COLOR(red){NULL} # (より一般の)空のオブジ...
-COLOR(red){as.list(NULL)} # 空のリスト
-COLOR(red){as.list(rep(NA, 5))} # 5つの(空の)成分 N...
> x <- numeric(0)
> x
numeric(0)
> x*0
numeric(0)
> x <- pi
> x
[1] 3.141593
> y <- NULL
> y[3] <- 3
> y
[1] NA NA 3
> z <- NULL
> z[[1]] <- 1:10
Error: more elements supplied than there are to replace
> z <- as.list(NULL)
> z[[1]] <- 1:10
> z
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> as.list(rep(NA,5))
[[1]]
[1] NA
[[2]]
[1] NA
[[3]]
[1] NA
[[4]]
[1] NA
[[5]]
[1] NA
**オブジェクトの一覧 [#m79eaa36]
ls()
**オブジェクトの削除 [#qe771ec1]
rm(object.name)
全てのオブジェクトを削除
rm(list=ls(all=TRUE))
*データフレーム [#hb6f1f54]
(詳しくは Tips [[データフレーム]] を参照)
**データフレームの成分をその成分名で参照できるようにする ...
> data(swiss) # 組み込みデータ swiss を読み込み
> swiss # swiss データは5成分からなるデータフ...
Fertility Agriculture Examination Education...
Courtelary 80.2 17.0 15 12...
Delemont 83.1 45.1 6 9...
...... (以下略) ..............................
> swiss$Fertility # 成分 Fertility の表示
[1] 80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 8...
[16] 68.3 71.7 55.7 54.3 65.1 65.5 65.0 56.6 57.4 72.5 7...
[31] 75.5 69.3 77.3 70.5 79.4 65.0 92.2 79.3 70.4 65.7 7...
[46] 44.7 42.8
> FertilityError: Object "Fertility" not found # Fertil...
> attach(swiss) # swiss データの各成分を成分ラベルで参...
> Fertility # Fertility という変数ができた
[1] 80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 8...
[16] 68.3 71.7 55.7 54.3 65.1 65.5 65.0 56.6 57.4 72.5 7...
[31] 75.5 69.3 77.3 70.5 79.4 65.0 92.2 79.3 70.4 65.7 7...
[46] 44.7 42.8
> detach(swiss) # もし不要で邪魔なら成分名で参照できな...
** subset で抽出したデータフレームの成分の存在していない ...
次のような関数を定義しておくと便利。lapply + factor では...
rm.level <- function(x){
sub.fun <- function(sub.df){
if (is.factor(sub.df)) factor(sub.df)
else sub.df
}
data.frame(lapply(x, sub.fun))
}
> x <- data.frame(a=c("a","b","c"), b=1:3)
> y <- subset(x, a!="c")
> summary(y)
a b
a:1 Min. :1.00
b:1 1st Qu.:1.25
c:0 Median :1.50
Mean :1.50
3rd Qu.:1.75
Max. :2.00
> y <- data.frame(lapply(x, factor))
> summary(y)
a b
a:1 1:1
b:1 2:1
c:1 3:1
> z <- subset(x, a!="c")
> z <- rm.level(z)
> summary(z)
a b
a:1 Min. :1.00
b:1 1st Qu.:1.25
Median :1.50
Mean :1.50
3rd Qu.:1.75
Max. :2.00
*R セッション [#m05e422c]
** 入力命令の再現(Unix の場合(だけ?)) [#e4de1cf4]
R のあるセッション中に入力した命令はすべて記録されており、
-上下矢印で過去に遡って順に表示し、再実行できる(これはWin...
-COLOR(magenta){Ctrl+r} (コントロールキーを押しながら r ...
-R セッションをセーブ付きで終了すると、入力命令の履歴が C...
*ファイル出力 [#o4f1f49c]
**描画ウインドウには日本語が出るのに、PDFやEPSファイルに...
PDF作成命令の中に、フォント指定 family="" が必要です。
(Windowsなどのフォントが自動的に流用されればいいのですが...
1.
> names(pdfFonts())
で、使えるフォント名を確認。いろいろ出るので、どれを使う...
2-1.PDFファイルを作る古典的方法でfamily指定。
> pdf("なんとか.pdf", family="フォント名")
> plot(あれこれ)
> ....
> dev.off()
2-2. PDFファイルを作る別法。スクリプトの最後に以下の一行...
> dev.copy2pdf(file="なんとか.pdf", family="フォント名")
注1.EPSファイルも、PDFと同様にできるかと思いきや、だめで...
注2.非標準かもしれないフォントを使って人にファイルを渡す...
*パッケージ関係 [#vef694be]
**パッケージの概要説明と利用できる関数名の表示 [#i2702e43]
既にインストールしているパッケージについて、その作成者な...
(とその説明)を表示します。以下は、パッケージ COLOR(magent...
> library( help = MASS )
**(標準配布以外の)各種パッケージの情報 [#b52086c6]
標準で配布されるパッケージ以外にどんなパッケージがあるか...
**非標準パッケージのインストール (但し OS が Unix-like な...
例えば COLOR(magenta){vegan} と呼ばれる、生態学用のパッケ...
-CRAN またはそのミラーサイトから vegan パッケージ COLOR(m...
-命令 COLOR(red){R CMD INSTALL vegan_1.4-4.tar.gz} でイン...
-但し、C や Fortran サブルーティンを用いるものは、インス...
-使う時は COLOR(red){library(vegan)} で読み込む
-新しいバージョンをインストールするのも同様の手続き(その...
*ショートカット(MSWindowsのrgui.exeの場合) [#fa2cb54c]
**一番下までスクロールする(上にスクロールした状態から) [#...
下向き矢印キーを一回押すと一番下までスクロールします。
**子窓(R内の窓)の操作(MDI) [#x581be2d]
-小窓間を移るにはコントロール+F6 もしくは コントロール...
-プログラムを終了しないで、開きすぎた小窓を閉じるには コ...
**コピーペースト [#c06b8b58]
もちろんコントロール+Cでコピー、コントロール+Vでペース...
**終了 [#kcb06360]
MSWindows標準のAlt+F4でも終了できますが、コントロール+Zで...
**コンソール [#c89a2394]
-クリアするにはコントロール+L
-行頭に飛ぶにはコントロール+A(AtamaのA) 行末に飛ぶには...
*ショートカット(MacOSのRGuiの場合) [#u2fe3329]
**コンソール [#x55933f3]
-フォントサイズを大きくするにはCommand + '+', 小さくする...
*終了 [#i973b283]
**今までの仕事を保存(次に使えるように全てのオブジェクトを...
quit("yes")
q("yes")
q() # 作業スペースを保存するかどうか問い...
とすると終了時に残っているオブジェクトは次回使えます(作業...
save()で分かりやすい場所に分かりやすい名前で保存して次々...
また .Rhistory と .Rdata を別のディレクトリにコピーすれば...
* デバッグのためのTips ~ 良くある(そして気づきにくい)間違...
> x=-3
> if (x<-2) cat(x,"?n") # x<-2 は x に 2 を代入する、そ...
2
> x=-3
> if (x < -2) cat(x,"?n") # x と -2 の大小比較
-3
> x = 2
> if (3.1) cat(x,"?n") # if (3.1) は真になる
2
**全角スペースの罠 [#j3086734]
# case1
x <- 1 # xに1を代入
y <-2 # yに2を代入
x+y #これはエラー
#.case2
x <- 1 # xに1を代入
y <-2 # yに2を代入
x+y #これは 大丈夫
#コメントには全角スペースは使えるが、それ以外では使えな...
超初心者Tipsですが、ハマったので追加しました。分かりにく...
訳の分からないエラーが出る時にチェックすべき点をここに追...
終了行:
COLOR(red){SIZE(30){山椒 Tips 集}}
初心者の悩みを解決する、小粒だけれどピリリと効く Tips 集...
#contents
*作業ディレクトリの確認・変更 [#xebbba2a]
ファイル入出力時などに必要かも
getwd() #作業ディレクトリの確認
setwd("指定する作業ディレクトリ") #作業ディレクトリの変更
*出力 [#i6012af6]
**有効数字桁数の変更 [#n7fba2b1]
表示される有効桁数を変える。内部演算桁数は変更されず。最...
options(digits=10) # 表示桁数を10桁に変える
**書式つき出力 [#i68cec21]
> options(scipen=10)
> p <- 0.0001
> p
[1] 0.0001
>formatC(p)
[1] "0.0001"
*ヘルプ [#te0871cc]
**関数の説明を見る [#d46dc33e]
関数 foo の説明と参考例コードを見る
help(foor)
?foo # 簡略形
予め COLOR(red){help.start()} を一度実行すると、それ以降...
**関数の参考例デモを見る [#i461f4dc]
COLOR(red){help()} で表示される、各関数の説明の最後には参...
example(lm) # 関数 lm の参考デモを見る
*Rを電卓のかわりに使う [#k97e5aef]
> sum(1,2,3,4)
[1] 10 #よしよし
> mean(1,2,3,4)
[1] 1 #あれ?
> mean(c(1,2,3,4))
[1] 2.5 #これが正解
Rの関数はコンマのあとは引数。
sum() などは、引数はベクトル要素と見なしてくれるので、上...
でも、mean() など、ベクトル演算の関数を使うときは、手抜き...
*グラフィックス [#te3e4724]
**グラフィックス出力を段階的に行なう [#s470781a]
次のグラフィックス出力の前に確認プロンプトがでる。特に CO...
par(ask=TRUE)
par(ask=FALSE) # 元に戻す
**グラフィックスオプションの退避・復帰 [#xad9542b]
グラフィックスのオプションパラメータを一時変更した後で、...
oldpar <- par(no.readonly = TRUE) # 現在の変更可...
(パラメータオプションの変更を伴う作業)
par(oldpar) ...
foo <- function ( ) {
oldpar <- par(no.readonly = TRUE)
(パラメータオプションの変更を伴う作業)
on.exit(par(oldpar)) #...
}
**ポストスクリプト出力が横向きになる [#w13f5b0a]
オプション COLOR(red){horizontal=FALSE} を使う。
postscript("foo.eps", horizontal=FALSE, height=9, widt...
(ポストスクリトへの出力)
dev.off() # デバイスを閉じる
**ポストスクリプトファイルが壊れる [#t0e3aea1]
出力が全部終ったら、すかさず COLOR(red){dev.off()} でデバ...
postscript("foo.eps", horizontal=FALSE, height=9, widt...
(ポストスクリトへの出力)
dev.off() # デバイスを閉じる
*プログラミング [#ef2cc354]
** R の組み込み関数の再定義にご注意 [#o38b529d]
R の組み込み関数、オブジェクトはCOLOR(magenta){自由に再定...
> "+" <- function (x) x # 過激な例
> +(1) # これが正しく意味を持つ
[1] 1
> 2+3 # + は二項演算子の意味を失っている
Error in 2 + 3 : unused argument(s) ( ...)
このような事態になったときの対処法は,再定義したオブジェ...
> ls() 今定義されているオブジェクトのリストを見る
[1] "+" その他いろいろのオブジェクト
> rm("+") "+" オブジェクトを取り除く!
> 3+4
[1] 7 なおった!
**コード中のコメント [#y2886d00]
コード中に # を置くと、それ以降行末までコメントとして無視...
foo <- function (x) {
x <- 0 # 変数 x に値 1 を代入する (本来のコメント)
# x <- 2 # コメントアウトされた一行
if(0){ # 複数行一括コメント化
(コメントアウトされた複数行)
}
)
**for文を書きましたが結果が出ません [#k3140a19]
> for(i in 1:3){2^i}
>
ブロック{ }内の結果を表示するには、print() や cat() が必...
> for(i in 1:3){print(2^i)}
[1] 2
[1] 4
[1] 8
**プログラムの実行を一時中断する [#yb4dcc73]
何かキー入力があるまでプログラムの実行を停止
> foo <- function(x) {
cat("sum of x is -->", sum(x), "?n")
readline("Can I proceed? ")
cat("prod of x is -->", prod(x),"?n") }
> temp(1:4)
sum of x is --> 10
Can I proceed? #ここで何かをキー入力すると次を実行
prod of x is --> 24
**プログラムの実行中に対話的に数値を入力する [#g120a85a]
COLOR(red){readline()} は入力した値を取り込むのにも使える
> foo <- function () {
x <- readline("Input some number ---> ") # 入力値...
cat(" Inputted number = ", x, "?n")
return(as.numeric(x))} # 入力された文字列化された...
> foo()
Input some number ---> 2.3
Inputted number = 2.3
[1] 2.3
**条件分岐 [#ob9a75d4]
普通の if 文 (条件についてベクトル化されていない)
if (x) A
if (x==0) A else B
if (x==0) A else if (x==1) B else C
二者択一 (条件についてベクトル化されている)
ifelse(x==0, A, B)
ifelse(x==0, A, ifelse(x==1, B, C) )
**付値演算子 [#g91eaf9e]
R の付値演算子 COLOR(red){<-}, COLOR(red){->}, COLOR(red)...
lm.D9 <- lm(weight ~ group) # 線形回帰の結果をオブジェ...
anova(lm.D9) # オブジェクトを anova 関数で処理
これを一行で書くと
anova(lm.D9 <- lm(weight ~ group)) # 線形回帰の結果をオ...
こんなこともできる
x <- y <- 10 # x <- (y <- 10) つまり assign(x, assign(y...
R のすべての関数・演算子は原則として何らかの値を返すよう...
**効率的な編集 [#l4adbe61]
関数(データ)の効率的な編集をするには、
-二つのウィンドを開き、一方で R を起動する
-もう一方のウィンドで適当なエディタでファイル("bar.R" と...
-R 起動中のウィンドで、ファイルを COLOR(red){source("bar....
-このプロセスを繰り返す
-COLOR(red){source("bar.R")} を何度も R のプロンプトに打...
sr <- function() source("bar.R")
-適当なエディタウインドウを開き,エディタでプログラムやデ...
**オプション入力の省略(省力) [#q0d476f2]
オプションをフルに書かなくてもいいケースがあります。イー...
mean(c(1, NA, 3), na.rm =TRUE) # NA を取り除いて平均を...
mean(c(1, NA, 3), na.rm =T)
mean(c(1, NA, 3), n=T)
mean(c(1, NA, 3), na.r=TRUE)
[1] 2
いずれも同じ結果を返します。
**R でプログレスバー([[参考サイト:http://www.programmingr...
pb <- winProgressBar(title="プログレスバーの例", label="...
for(i in 1:100) {
Sys.sleep(0.1) # slow down the code for illustration p...
info <- sprintf("%d%% 完了", round((i/100)*100))
setWinProgressBar(pb, i/(100)*100, label=info)
}
*ベクトル [#u229f3dd]
**ベクトルの一部を取り出す [#mf2057ab]
> x <- c(1,2,3,4,5,6,7,8,9) # x <- 1:9 でも良い
> x[2:5] # x[2], x[3], ..., x[5] を取り出す...
[1] 2 3 4 5
> x[-2:5] # x[2], x[3], ..., x[5] 以外を取り...
[1] 1 6 7 8 9
> y <- x%%3==0
> y
[1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE
> x[y] # 論理値ベクトル指定、x[x%%3==0] で...
[1] 3 6 9
**ベクトルの要素がある条件を満たすような添字を取り出す [#...
> x <- runif(10)
> y <- which(x < 0.5) # 0.5 未満以の値を持つ要素の添字...
> y
[1] 3 5 6 10
> x[y] # 0.5 未満以の値を持つ要...
[1] 0.40643515 0.26432576 0.35265039 0.08640936
> (1:length(x))[x < 0.5] # 同じことを少し複雑に行なう
[1] 3 5 6 10
**(規則的な)ベクトルを作る [#f69f5d28]
-COLOR(red){a:b} # a から始ま...
-COLOR(red){seq(a, b, by = c)} # a から始まり(b ...
-COLOR(red){seq(a, b, length = n)} # a, b 間を n 等分す...
-COLOR(red){seq(along = x)} # 1:length(x)
-COLOR(red){rep(x, n)} # x を n 回繰...
-COLOR(red){numeric(n)} # 0 を n 個並べ...
> x <- runif(100) # 一様疑似乱数 100 個からなるベクト...
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
> 10:1
[1] 10 9 8 7 6 5 4 3 2 1
> (-1):5
[1] -1 0 1 2 3 4 5
> (-1):(-5)
[1] -1 -2 -3 -4 -5
> 1.3:10
[1] 1.3 2.3 3.3 4.3 5.3 6.3 7.3 8.3 9.3
> (-1.3):10
[1] -1.3 -0.3 0.7 1.7 2.7 3.7 4.7 5.7 6.7 7.7 ...
> (1:10)/10
[1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(0, 1, length = 11) # 0 と 1 の間を 11等分する等...
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(1, 9, by = 2) 公差 2 の等差数列
[1] 1 3 5 7 9
> seq(1, 9, by = pi)
[1] 1.000000 4.141593 7.283185
> seq(1, 6, by = 3)
[1] 1 4
> seq(17) # 1:17 と同じ
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
> x= c("a", "b", "c", "d", "e", "f")
> seq(along = x) # 1:length(x)
[1] 1 2 3 4 5 6
> rep(0,10)
[1] 0 0 0 0 0 0 0 0 0 0
> rep(1:2,10)
[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
> x <- numeric(10)
> x
[1] 0 0 0 0 0 0 0 0 0 0
**同じ数を繰り返すベクトル(2005/02/02) [#ye9cbdd5]
度数分布表のようなものから元のデータを再現するときなどに
x <- c(rep(100, 5), rep(101,8), rep(102,13), ..., rep(18...
とするのは大変。
x <- rep(100:180, c(5,8,13, ..., 3))
のようにすると簡単。~
繰り返される数値が等差数列なら,
x <- rep(n:m*k+i, c(5, 8, 13, ..., 3))
とか,特に規則性がないときでも,
x <- rep(c(a,b,c,d,...), c(x,y,z,u, ...))
とか。~
繰り返しも二通りある。どちらでもいい場合もあるし,どちら...
> rep(1:3, 4)
[1] 1 2 3 1 2 3 1 2 3 1 2 3
> rep(1:3, each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3
*因子 [#b40a5b3e]
**因子オブジェクトを作る [#m96ce538]
> x <- factor(c("s","t","a","t","i","s","t","i","c","s")...
> x
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
**存在していない level を消去する [#a8c9e343]
> x
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> factor(x) # x[, drop=TRUE] でも同じ
[1] s t a t i s t i c s
Levels: a c i s t
*リスト [#ea2cc26d]
**入れ子状のリストを作る(その1) [#xc9527b9]
> data(iris)
> sp <- unique(iris$Species)
> nested.list <- list()
> for(i in 1:length(sp)){
> nested.list[i] <- list(subset(iris, Species==sp[i]))
> }
> summary( nested.list[[1]])
Sepal.Length Sepal.Width Petal.Length Petal.W...
Min. :4.300 Min. :2.300 Min. :1.000 Min. :...
1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:...
Median :5.000 Median :3.400 Median :1.500 Median :...
Mean :5.006 Mean :3.428 Mean :1.462 Mean :...
3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:...
Max. :5.800 Max. :4.400 Max. :1.900 Max. :...
**入れ子状のリストを作る(その2) [#tb1c89ba]
> data(warpbreaks)
> wl <- unique(warpbreaks$wool)
> tn <- unique(warpbreaks$tension)
> nested.list <- list()
> for(i in 1:length(wl)){
> nested.tmp <- list()
> for(j in 1:length(tn)){
> nested.tmp[j] <- list(subset(warpbreaks, wool=...
> }
> nested.list[i] <- list(nested.tmp)
> }
> nested.list[[1]][[2]]
breaks wool tension
10 18 A M
11 21 A M
12 29 A M
13 17 A M
14 12 A M
15 18 A M
16 35 A M
17 30 A M
18 36 A M
*行列 [#j0835429]
**対角行列を作る [#j43478f2]
> diag(1, ncol=3, nrow=3) # 値 1 がリサイクル使用される
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> diag(rep(1, 3)) # diag(c(1,1,1)) と同じ
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> x <- matrix(0, ncol=3, nrow=3) # 全成分が 0 の行列
> diag(x) <- 1 # 対角成分...
> x
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> diag(x) <- c(1, 2, 3) # 対角成分を ...
> x # diag(1:3) ...
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
**行列の添字操作 [#f93e6c48]
> x <- matrix(runif(9), ncol=3, nrow=3)
> x
[,1] [,2] [,3]
[1,] 0.8296189 0.9144157 0.60020004
[2,] 0.9440765 0.5413652 0.03560994
[3,] 0.0623679 0.6051179 0.57717385
> x[1, 3] # (1,3)成分
[1] 0.6002
> x[, 3] # 第3列 (ベクトルになる)
[1] 0.60020004 0.03560994 0.57717385
> x[1,] # 第1列 (ベクトルになる)
[1] 0.8296189 0.9144157 0.6002000
> x[, 3, drop=FALSE] #第3列 (3x1 行列になる)
[,1]
[1,] 0.60020004
[2,] 0.03560994
[3,] 0.57717385
> x[1, , drop=FALSE] # 第1行 (1x3行列になる)
[,1] [,2] [,3]
[1,] 0.8296189 0.9144157 0.6002
> x[c(1,2), c(3,2)] # 2x2副行列の取り出し、c(3,2)の順序...
[,1] [,2]
[1,] 0.60020004 0.9144157
[2,] 0.03560994 0.5413652
> x[-1,] # 第2,3行からなる2x3行列
[,1] [,2] [,3]
[1,] 0.9440765 0.5413652 0.03560994
[2,] 0.0623679 0.6051179 0.57717385
> x[x >= 0.5] # 0.5より大きな成分は?
[1] 0.8296189 0.9440765 0.9144157 0.5413652 0.6051179 0....
> x[x >= 0.5] <- 0 # 0.5より大きな成分を0に置き換え
> x
[,1] [,2] [,3]
[1,] 0.0000000 0 0.00000000
[2,] 0.0000000 0 0.03560994
[3,] 0.0623679 0 0.00000000
> i <- which(x != 0) # 0でない成分の添字
> i # xをベクトルと考えた時の...
[1] 3 8
> x[i] # x[x != 0] と同じ
[1] 0.06236790 0.03560994
> which(x != 0, arr.ind=T) # 0でない添字を行列として取...
row col
[1,] 3 1 # つまり x[3,1]=0...
[2,] 2 3
COLOR(red){注意!} ベクトルや行列にNAが入っている場合は、...
入力
x<-c(1,2,NA)
x[x==1]
x[which(x==1)]
結果
> x<-c(1,2,NA)
> x[x==1]
[1] 1 NA
> x[which(x==1)]
[1] 1
*オブジェクト [#q3db0073]
**空のオブジェクトを作る [#pe17adbe]
スカラー、ベクトル、リストオブジェクトを初期化するさい、...
-COLOR(red){numeric(0)} # 空の数値ベクトル
-COLOR(red){NULL} # (より一般の)空のオブジ...
-COLOR(red){as.list(NULL)} # 空のリスト
-COLOR(red){as.list(rep(NA, 5))} # 5つの(空の)成分 N...
> x <- numeric(0)
> x
numeric(0)
> x*0
numeric(0)
> x <- pi
> x
[1] 3.141593
> y <- NULL
> y[3] <- 3
> y
[1] NA NA 3
> z <- NULL
> z[[1]] <- 1:10
Error: more elements supplied than there are to replace
> z <- as.list(NULL)
> z[[1]] <- 1:10
> z
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> as.list(rep(NA,5))
[[1]]
[1] NA
[[2]]
[1] NA
[[3]]
[1] NA
[[4]]
[1] NA
[[5]]
[1] NA
**オブジェクトの一覧 [#m79eaa36]
ls()
**オブジェクトの削除 [#qe771ec1]
rm(object.name)
全てのオブジェクトを削除
rm(list=ls(all=TRUE))
*データフレーム [#hb6f1f54]
(詳しくは Tips [[データフレーム]] を参照)
**データフレームの成分をその成分名で参照できるようにする ...
> data(swiss) # 組み込みデータ swiss を読み込み
> swiss # swiss データは5成分からなるデータフ...
Fertility Agriculture Examination Education...
Courtelary 80.2 17.0 15 12...
Delemont 83.1 45.1 6 9...
...... (以下略) ..............................
> swiss$Fertility # 成分 Fertility の表示
[1] 80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 8...
[16] 68.3 71.7 55.7 54.3 65.1 65.5 65.0 56.6 57.4 72.5 7...
[31] 75.5 69.3 77.3 70.5 79.4 65.0 92.2 79.3 70.4 65.7 7...
[46] 44.7 42.8
> FertilityError: Object "Fertility" not found # Fertil...
> attach(swiss) # swiss データの各成分を成分ラベルで参...
> Fertility # Fertility という変数ができた
[1] 80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 8...
[16] 68.3 71.7 55.7 54.3 65.1 65.5 65.0 56.6 57.4 72.5 7...
[31] 75.5 69.3 77.3 70.5 79.4 65.0 92.2 79.3 70.4 65.7 7...
[46] 44.7 42.8
> detach(swiss) # もし不要で邪魔なら成分名で参照できな...
** subset で抽出したデータフレームの成分の存在していない ...
次のような関数を定義しておくと便利。lapply + factor では...
rm.level <- function(x){
sub.fun <- function(sub.df){
if (is.factor(sub.df)) factor(sub.df)
else sub.df
}
data.frame(lapply(x, sub.fun))
}
> x <- data.frame(a=c("a","b","c"), b=1:3)
> y <- subset(x, a!="c")
> summary(y)
a b
a:1 Min. :1.00
b:1 1st Qu.:1.25
c:0 Median :1.50
Mean :1.50
3rd Qu.:1.75
Max. :2.00
> y <- data.frame(lapply(x, factor))
> summary(y)
a b
a:1 1:1
b:1 2:1
c:1 3:1
> z <- subset(x, a!="c")
> z <- rm.level(z)
> summary(z)
a b
a:1 Min. :1.00
b:1 1st Qu.:1.25
Median :1.50
Mean :1.50
3rd Qu.:1.75
Max. :2.00
*R セッション [#m05e422c]
** 入力命令の再現(Unix の場合(だけ?)) [#e4de1cf4]
R のあるセッション中に入力した命令はすべて記録されており、
-上下矢印で過去に遡って順に表示し、再実行できる(これはWin...
-COLOR(magenta){Ctrl+r} (コントロールキーを押しながら r ...
-R セッションをセーブ付きで終了すると、入力命令の履歴が C...
*ファイル出力 [#o4f1f49c]
**描画ウインドウには日本語が出るのに、PDFやEPSファイルに...
PDF作成命令の中に、フォント指定 family="" が必要です。
(Windowsなどのフォントが自動的に流用されればいいのですが...
1.
> names(pdfFonts())
で、使えるフォント名を確認。いろいろ出るので、どれを使う...
2-1.PDFファイルを作る古典的方法でfamily指定。
> pdf("なんとか.pdf", family="フォント名")
> plot(あれこれ)
> ....
> dev.off()
2-2. PDFファイルを作る別法。スクリプトの最後に以下の一行...
> dev.copy2pdf(file="なんとか.pdf", family="フォント名")
注1.EPSファイルも、PDFと同様にできるかと思いきや、だめで...
注2.非標準かもしれないフォントを使って人にファイルを渡す...
*パッケージ関係 [#vef694be]
**パッケージの概要説明と利用できる関数名の表示 [#i2702e43]
既にインストールしているパッケージについて、その作成者な...
(とその説明)を表示します。以下は、パッケージ COLOR(magent...
> library( help = MASS )
**(標準配布以外の)各種パッケージの情報 [#b52086c6]
標準で配布されるパッケージ以外にどんなパッケージがあるか...
**非標準パッケージのインストール (但し OS が Unix-like な...
例えば COLOR(magenta){vegan} と呼ばれる、生態学用のパッケ...
-CRAN またはそのミラーサイトから vegan パッケージ COLOR(m...
-命令 COLOR(red){R CMD INSTALL vegan_1.4-4.tar.gz} でイン...
-但し、C や Fortran サブルーティンを用いるものは、インス...
-使う時は COLOR(red){library(vegan)} で読み込む
-新しいバージョンをインストールするのも同様の手続き(その...
*ショートカット(MSWindowsのrgui.exeの場合) [#fa2cb54c]
**一番下までスクロールする(上にスクロールした状態から) [#...
下向き矢印キーを一回押すと一番下までスクロールします。
**子窓(R内の窓)の操作(MDI) [#x581be2d]
-小窓間を移るにはコントロール+F6 もしくは コントロール...
-プログラムを終了しないで、開きすぎた小窓を閉じるには コ...
**コピーペースト [#c06b8b58]
もちろんコントロール+Cでコピー、コントロール+Vでペース...
**終了 [#kcb06360]
MSWindows標準のAlt+F4でも終了できますが、コントロール+Zで...
**コンソール [#c89a2394]
-クリアするにはコントロール+L
-行頭に飛ぶにはコントロール+A(AtamaのA) 行末に飛ぶには...
*ショートカット(MacOSのRGuiの場合) [#u2fe3329]
**コンソール [#x55933f3]
-フォントサイズを大きくするにはCommand + '+', 小さくする...
*終了 [#i973b283]
**今までの仕事を保存(次に使えるように全てのオブジェクトを...
quit("yes")
q("yes")
q() # 作業スペースを保存するかどうか問い...
とすると終了時に残っているオブジェクトは次回使えます(作業...
save()で分かりやすい場所に分かりやすい名前で保存して次々...
また .Rhistory と .Rdata を別のディレクトリにコピーすれば...
* デバッグのためのTips ~ 良くある(そして気づきにくい)間違...
> x=-3
> if (x<-2) cat(x,"?n") # x<-2 は x に 2 を代入する、そ...
2
> x=-3
> if (x < -2) cat(x,"?n") # x と -2 の大小比較
-3
> x = 2
> if (3.1) cat(x,"?n") # if (3.1) は真になる
2
**全角スペースの罠 [#j3086734]
# case1
x <- 1 # xに1を代入
y <-2 # yに2を代入
x+y #これはエラー
#.case2
x <- 1 # xに1を代入
y <-2 # yに2を代入
x+y #これは 大丈夫
#コメントには全角スペースは使えるが、それ以外では使えな...
超初心者Tipsですが、ハマったので追加しました。分かりにく...
訳の分からないエラーが出る時にチェックすべき点をここに追...
ページ名: