Rのページ

Rは統計処理言語の一つで,Sをベースにしてオープンソースとして開発されているものです. 統計処理はもちろんのこと,グラフィックも強力ですので,個人的にはグラフソフトとして使っています. ほとんどのコマンドがコマンドラインで指定するので,プログラムライクという意味では使いやすいのですが,機能が多いためにオプションの指定が面倒です. このページでは,Rを使ったグラフの描画を中心に書きたいと思います.

グラフ描画補助プログラム

Rできれいなグラフを書くのは比較的面倒です. そこで,グラフを書くのを支援するGUIをtcltkを使って作ってみました. tkを使うためのツールtktool.rと, plotコマンドのパラメータなどを格納したファイルplot.rと, プログラム本体graphtk.rが必要です. それらのファイルを置いてあるフォルダを作業ディレクトリにしてから, source("graphtk.rb")として,出てきたメニューから使用します. 2017/10/11に更新しました.

Rの使用法

データを読み込んで,データ処理をして,グラフを書くという一連の作業を,分割して要点を示したいと思います.

代入

代入は<-で行いますが,assignを使うと文字列で変数名を指定して代入することもできます.
x<-"e"
"y"<-"e"
assign(x,2.71828)
グローバル変数に代入するときには,<<-を使います. getを用いて文字列で変数名を指定して値を取り出すこともできます.
apple<-10; orange<-100
s<-"apple"
x<-get(s)

データの種類

Rにおいては,データはベクトルかリストとして取り扱われます. スカラーに見えるデータは,通常は大きさが1のベクトルとなっています. 行列もベクトルの特殊なものとみなすことができます. あとで紹介するデータフレームも,リストの特殊なものです.

ベクトル

ベクトルの要素はすべて同じ型で無ければならず,1から始まるindexを指定して要素を取り出します. ベクトルに関する代表的なコマンドを以下の表に示します.
コマンド 内容
dv<-c(1,2,3) 指定した数の列をdvに記録します.
dv<-1:5 1から5までの連続した整数の列をdvに記録します.
dv<-seq(1,5,by=0.5) 1から5までの0.5おきの数の列を,dfに記録します.
dv<-seq(1,5,length=3) 1から5までの長さが3の数列を,dfに記録します.
dv[n] n番目の要素の取り出し.(1が最初の要素です.)
dv<-dv[-n] n番目の要素の削除.
length(dv) ベクトルの長さ.
z<-c(x,y) ベクトルの結合.
x<-ifelse(x<0,x,0) 0以下の数字を0にする.
数値のベクトルには,通常に演算や関数を適用することができますが,そのときには,それぞれの要素に関して,演算や関数が適用されたベクトルとなります. 例えば1を足すと,すべての要素に1を足したベクトルになります. ベクトルとベクトルの演算に関しては,長さが等しいときにはそれぞれの成分毎に計算され,長さが倍数のときには短い方のベクトルが繰り返し使われて成分毎に計算されます. また,sum(),mean(),var(),median(),cor(),max(),min()のような統計関数を使うことができます.

リスト

リストの要素はどんなものでもよく,1から始まるindexまたは,nameを指定して要素を取り出します. ベクトルのリストやリストのリストなども作ることができます.
x<-list(first=1,second="2")
str(x)
x[[1]]
x$second

データの読み込み

ファイルからデータを読み込むときには,以下の表のコマンドを使います. ファイルは,単純な区切り文字で区切られたテキストで,それ以外の部分があるとエラーを返してしまいますが,その場合には"#"でコメントアウトします. コメントを示す文字を指定するためには、comment.char="*"などとします。 先頭にそれぞれのデータの名前を示した行があっても構いませんが,その場合には,header=TRUEを指定します.
コマンド 内容
df<-read.table("file",header=TRUE) スペース区切りのファイルから読み込んで,dfに記録します.
df<-read.table("file",header=TRUE,sep=":") コロン区切りのファイルから読み込んで,dfに記録します.
df<-read.csv("file",header=TRUE) コンマ区切りのファイルから読み込んで,dfに記録します.
読み込んだデータは,データフレームになります. これらのデータにアクセスするためには,df$nameという感じで行います. データフレーム中のデータの名前は.colnames(df)で表示できます. 読み込んだデータフレームはedit(df)などとすると、それぞれの値を編集することができます。 値を更新するためには、df<-edit(df)とします。 データフレームに新たなデータを加えるには、df[["d2"]]<-df$d1などとします。 データフレームからデータを取り除くには、df[["d1"]]<-NULLなどとします。

グラフ

グラフは,細かいことを気にしなければ次のコマンドで書くことができます.
plot(x,y)
実際には,見栄えを良くするために,様々なオプションをつけたり, コマンドを指定しなければなりません.

グラフを書くコマンドの前に指定する代表的なオプションを挙げておきます.
コマンド 内容
par(ps=14) 文字のサイズを指定します.
par(mar=c(2.5,3.0,0.5,1)) 下,左,上,右のマージンを指定します.
par(xaxs="i",yaxs="i") x軸とy軸のスタイルを指定します.(r:regular,i:internal,s:standard,e:extended,d:direct)
par(tcl=0.5) tickの長さを指定します.負だと外になります.
par(las=1) labelのスタイルを指定します.(0:軸と平行,1:水平,2:軸と垂直,3:鉛直)
par(new=TRUE) 前のグラフに上書きします.

代表的なplotの括弧の中で指定するオプションを挙げておきます.
コマンド 内容
type="l" プロットのタイプを指定します.(p:点,l:線,o:点と線を重ねる,b:点と線,h:ヒストグラム,sS:ステップ)
lty=1 線のタイプを指定します.(1:実線,2:破線,3:点線,4:一点破線,5:長い破線,6:二点破線)
bty="o" プロットの回りの箱のタイプを指定します.(o:描く,n:描かない)
lwd=1 線の太さを指定します.
pch=1 点の記号を指定します.(1:丸,2:三角,3:十字,...)
col="red" 色を指定します.
ann=FALSE 軸の名前などの注釈を付けるか指定します.
axes=FALSE 軸を描くか指定します.
plotの後で指定する代表的なコマンドを挙げておきます.
コマンド 内容
box() プロットの回りに箱を描きます.
axis(side=1,tick=TRUE,label=TRUE) 軸を描きます.(1:下,2:左,3:上,4:右)
mtext(expression(paste(italic(T)," (K)")),side=1) 軸の説明を描きます.
text(x=1,y=2,expression(paste(H[2],O))) 文字列を描きます.
legend(x=1,y=2,c("a","b"),col=rainbow(2),lty=1,lwd=1,bty='n') 凡例を付けます.
lines(c(1,2),c(3,4)) 線を描きます.

数式

expressionを使ってグラフの中に数式などを書くことができますが,少し癖があります. いくつもの数式と文字列を並べて書く場合には,pasteが必要です.
expression(paste(2^3==8,"  (1)"))
化学式などを書くために必要な工夫などについて,下に羅列します.
内容 説明
下付き expression(paste(H[2],O[2])) []で下付きにできますが,その後に続けるときにはカンマで区切ります.
上付き expression(paste(2^{10+5})) ^で上付きにできますが,範囲を指定するためには{}で囲みます.
イオン expression(paste(Zn^{2+phantom()})) +や-は,その後に何も無いとエラーになるのでphantom()をつけます.

文字列

文字列を処理するコマンドもいろいろと用意されています.
コマンド 内容
paste(c("a","b"),collapse=",") 文字列の配列をくっつける.
paste("a","b",sep=",") 複数の文字列をくっつける.
sprintf("a=%d",a) フォーマット付きの文字列.
sub("1","a","112233") 置換.
gsub("1","a","112233") 全部置換.

フィッティング

線型回帰はlm()を使ってフィットします. linear modelの略のようです. xとyにデータが入っている場合には,lm(y~x)とすると,y=ax+bでフィットします. summary()で結果の要約を,coefficients()で係数を見ることができます. 多項式フィットもlm()を使います. lm(y~x+I(x^2))などとします. 非線形の場合には,nls()を使います. non-linear least squareの略のようです.

Tcl/Tk

GUIをTcl/Tkを使って作ることができる.
require(tcltk)
tt<-tktoplevel()
いくつかのwidgetについて少し使いやすくするための ツール を作りましたので,参考にして下さい.

プログラム

Rでプログラムを組むことができます. その基礎を,例を示すことで紹介します.

条件分岐

if(x<0){y <- -x}
else{y <- x}
switch(
)

ループ

repeatで,永久ループをすることができます.
i<-0
repeat{ cat(i); i<-i+1; if(i>10){break}}
forやwhileループも使えます.
for(i in 1:10){ cat(i) }
for(i in list(1,"a",2,"b")){ cat(i) }
i<-0
while(i<10){ cat(i); i<-i+1 }

関数

値を返す関数を定義することができる.
larger <- function(x,y){
  if(x>y){z <- x}
  else{z <- y}
  return(z)
}
larger(1,2)
関数に値を代入するような形で使用する特殊な関数も定義することができる.
"larger<-" <- function(x,value){
  if(x<value){x <- value}
  else{x<-x}
}
a<-1
larger(x)<-2
x