データを用意する ― 外部データの読み込み・ベクトルと行列の操作を覚えましょう
外部データの読み込み方法についてはこちらで説明しているので参考にしてください。
Rはベクトルや行列の操作が非常に強力なので,ExcelVBAでセル操作が基本というのであれば,Rでは行列の操作が基本であるといえます。つまりRにおいて行列の操作を極めることがRによるプログラミングを習得する近道といえます。
■行列の作成
データ行列を作成するにはmatrix()を使います。引数のncol=3は3列の行列を作れということで,引数に行数を指定する(row=行数)こともできますがncol=だけで用は足りてしまいます。
> dat<-matrix(c(1,2,3,4,5,6,7,8,9),ncol=3) > dat [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
matrix()の引数でbyrow=Tと指定すれば転置行列になります。
> dat2<-matrix(c(1,2,3,4,5,6,7,8,9),ncol=3,byrow=T) > dat2 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9
行列の作成はrbind()やcbind()を使用することによっても作成できます。
> dat3<-rbind(c(1,2,3),c(4,5,6),c(7,8,9)) > dat3 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9
> dat4<-cbind(c(1,2,3),c(4,5,6),c(7,8,9)) > dat4 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
rbind()とcbind()を利用すれば行列同士の結合も可能です。
> rdat<-rbind(dat3,dat4) > rdat [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 1 4 7 [5,] 2 5 8 [6,] 3 6 9 > cdat<-cbind(dat3,dat4) > cdat [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 1 4 7 [2,] 4 5 6 2 5 8 [3,] 7 8 9 3 6 9
■行列の要素を抽出する
> dat [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
行列の要素を1つだけ取り出したい場合
> dat[1,2] [1] 4
任意の行または列を取り出したい場合
> dat[2,] [1] 2 5 8 > dat[,1] [1] 1 2 3
■行列にラベルを付ける
行列にラベルを付ける必要性はあまりないようにも思いますが,大量のデータを扱う場合はラベルを付けておいた方が分かり易いかもしれません。むしろ,これはグラフを作成するときによく使います。
> dat<-matrix(c(1,2,3,4,5,6,7,8,9),ncol=3) > dat [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > dimnames(dat)<-list(c(paste("sub",1:3,sep="")),c(paste("group",1:3,sep=""))) > dat group1 group2 group3 sub1 1 4 7 sub2 2 5 8 sub3 3 6 9 > dimnames(dat)<-list(c("bak","aho","tonma"),c("shine","kuso","hedo")) > dat shine kuso hedo bak 1 4 7 aho 2 5 8 tonma 3 6 9
ベクトルについても同じようなことができます。
> x<-c(1:5) > x [1] 1 2 3 4 5 > names(x)<-paste("group",1:5,sep="") > x group1 group2 group3 group4 group5 1 2 3 4 5 > names(x)<-paste(c("A","B","C","D","E")) > x A B C D E 1 2 3 4 5
■行平均と列平均を求める
apply()を用いることによって簡単に行平均や列平均を求めることができます。行列ではなくベクトルに対して行うときにはsapply()を使用します。
書式:apply(データ行列,1 or 2,適用する関数)
書式:sapply(ベクトル,適用する関数)
例えば,行平均と列平均を求める場合は次のようにします。
> dat [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > apply(dat,1,mean) #行平均を出力 [1] 4 5 6 > apply(dat,2,sum) #列合計を出力 [1] 6 15 24
■データフレームの作成
> a <- c(1,2,3,4,5) > b <- c(6,7,8,9,10) > c <- c(2,4,6,8,10) > d <- c(1,3,5,7,9) > my.data <- data.frame(lowData=a, upData=b, evenNum=c, oddNum=d) > my.data lowData upData evenNum oddNum 1 1 6 2 1 2 2 7 4 3 3 3 8 6 5 4 4 9 8 7 5 5 10 10 9 > lowData エラー: オブジェクト "lowData" は存在しません > attach(my.data) #attch()を使用してパスを通しておけば、変数名にアクセスできる > lowData [1] 1 2 3 4 5 > detach(my.data) #解除する場合はdetach()を使用する > lowData エラー: オブジェクト "lowData" は存在しません