[連載]フリーソフトによるデータ解析・マイニング 第3回
Rでのデータの編集と演算
データの解析や処理を行うためには、データについて、その構造の確認や編集などが必要である場合がある。
1.データの編集
(1)データのサイズの確認
ここでは入力されているデータsales2を用いて説明する。データsales2は2行5列で、データフレーム型で入力されている。
> sales2
Cherry Apple Grape Banana Other
A 15 20 25 10 30
B 10 25 20 25 20
次に示すように関数ncol, nrow, dimを用いると、データフレームおよび行列の行数、列数や配列の次元を求めることが可能である。その例を次に示す。
> nrow(sales2)
[1] 2
> ncol(sales2)
[1] 5
> dim(sales2)
[1] 2 5
(2)データの編集エディタ
Rには、データ編集のための関数edit、edit.data.frame、data.entry、fixなどがある。 editは「テキストエディタの起動」、edit.data.frameは「データフレームと行列の編集」、data.entryは「データ入力のための表計算ソフト風のインタフェイス」、fixは「オブジェクトの編集」用として作成されている。しかし、最近のバージョンでは、データオブジェクトが作成されている場合は、上記の関数のいずれもデータを表計算ソフト風のエディタで編集を行うことができるようになっている。例えば、コマンド
>edit(sales2)
を実行すると、次のページ図1のような編集画面が開かれる。編集画面はExcelほど便利ではないが、セル単位で編集が可能である。

図1 データ編集エディタの画面
関数editで編集したデータを保存するためには、付値の手続きが必要である。sales2をeditで編集し、その結果をtempという名前で保存したいとき、sales2に上書きしたいときの例を次に示す。
>temp<-edit(sales2)
>sales2<-edit(sales2)
関数editを用いてデータセットの行、あるいは列を付け加えたいときには、データセットをデータフレーム型にした方がよい。
関数fixを用いてデータを編集すると、編集された新しい結果が直接上書きされるので付値の手順は必要としない。
このように、異なるデータ編集用の関数はそれぞれ特徴を持っている。
(3)データセットの結合
データフレームや行列などの行の追加や列の追加が必要な場合がある。Rにはデータフレームおよび行列の結合の関数rbind、cbindがある。例えば、データフレームsales2の最後の行の後にデータ20、30、15、20、15を追加したいときには次のように行う。
> rbind(sales2,c(20,30,15,20,15))
Cherry Apple Grape Banana Other
A 15 20 25 10 30
B 10 25 20 25 20
20 30 15 20 15
関数rbind、cbindは同じ長さの行、あるいは列のデータフレームや行列を結合することが可能である。例えば、行列A、Bがあるとする。
![]()
データ行列A、Bの作成とrbind(A,B)、cbind(A,B)の実行結果を示す。
> A<-matrix(0,2,2)
> A [1,]<-c(1,1)
> A [2,]<-c(2,4)
> B<-matrix(0,2,2)
> B [1,]<-c(4,3)
>B [2,]<-c(2,4)
> rbind(A,B)
[,1] [,2]
[1,] 1 1
[2,] 2 4
[3,] 4 3
[4,] 2 4
> cbind(A,B)
[,1] [,2] [,3] [,4]
[1,] 1 1 4 3
[2,] 2 4 2 4
関数 rbindを用いるためにはデータフレーム、あるいは行列の列数が一致し、cbindは行数が一致しなければならない。
(4)データの並べ替え
ベクトル、行列の要素を並べ替える関数はsortである。sortはデータを昇順に並べ替える。
> sort(c(3,2,4,1))
[1] 1 2 3 4
また、Rにはデータを逆の順序で並べ替える関数revがある。
> rev(c(3,2,4,1))
[1] 1 4 2 3
データフレーム、あるいは行列を、ある行、列を基準にし、並べ替えるのには、関数sort.listあるいはorderを用いて行うことが可能である。
例えば、データセットsales2を、第1行を基準にし、昇順に並べ替えは次のように行うことができる。関数orderを用いても結果は同じである。
> sales2[,sort.list(sales2[1,])]
Banana Cherry Apple Grape Other
A 10 15 20 25 30
B 25 10 25 20 20
2.データの演算
Rでは、算術演算、論理演算、比較演算、行列の演算などの演算を行うことができる。
(1)算術演算
主な算術演算は、加算、減算、乗算、除算、べき算で、それぞれの演算は記号+, −、*、 /、^を用いる。演算の名称と記号との対応関係およびその演算例を表1に示す。
表1 算術演算の表記
|
名称 |
表記 |
例 |
結果 |
|
加算 |
+ |
3+2 |
5 |
|
減算 |
− |
3−2 |
1 |
|
乗算 |
* |
3*2 |
6 |
|
除算 |
/ |
3/2 |
1.5 |
|
べき算 |
^ |
2^3 |
8 |
|
|
^ |
8^(1/3) |
2 |
|
除算の商 |
%/% |
5%/%2 |
2 |
|
除算の余 |
%% |
5%%2 |
1 |
表1に示す算術演算はベクトル、データフレーム、行列にも有効である。ベクトル、データフレーム、行列では、対応する要素の間で表1の例のように算術演算を行う。両ベクトルの算術演算のコマンドおよびその結果を次に示す。
> x<-c(1,2,3,4)
> y<-c(4,2,3,1)
> x+y
[1] 5 4 6 5
> x-y
[1] -3 0 0 3
> x*y
[1] 4 4 9 4
> x/y
[1] 0.25 1.00 1.00 4.00
> x^2
[1] 1 4 9 16
> x%/%2
[1] 0 1 1 2
> x%%2
[1] 1 0 1 0
行列に関しては、作成した行列A, Bを用いて演算を行ってみてください。算術演算における優先順位は次の通りである。
@括弧
Aべき算(^)
B除算の商と余( %/%、%%)
C乗算と除算(*、/、)
D加算と減算(+、−)
(2)比較演算
比較演算は、より大きいか、小さいか、等しいかなどを比較するための演算である。表2に比較演算子の名称と記号との対応関係および例を示す。
表2 比較演算の表記
|
名称 |
表記 |
例 |
結果 |
|
より大 |
> |
3>2 |
TRUE |
|
より大か等しい |
>= |
3>=4 |
FALSE |
|
より小 |
< |
3<2 |
FALSE |
|
より小か等しい |
<= |
3<=4 |
TRUE |
|
等しい |
== |
3==4 |
FALSE |
|
等しくない |
!= |
3!=4 |
TRUE |
前節で作成したベクトルx, yを用いた比較演算とその結果を次に示す。
> x>y
[1] FALSE FALSE FALSE TRUE
> x>=y
[1] FALSE TRUE TRUE TRUE
> x!=y
[1] TRUE FALSE FALSE TRUE
> x==y
[1] FALSE TRUE TRUE FALSE
(3)論理演算
論理演算は、真(TRUE)、偽(FALSE) の2値の演算である。表3に論理演算の名称と記号との対応関係および例を示す。表の中のTはTRUE、FはFALSEの略である。
表3 論理演算の記号
|
名称 |
表記 |
例 |
結果 |
|
否定(NOT) |
! |
!(F) |
TRUE |
|
積(AND) |
& |
T & T |
TRUE |
|
積(AND) |
&& |
T && T |
TRUE |
|
和(OR) |
| |
T | F |
TRUE |
|
和(OR) |
|| |
T || F |
TRUE |
|
排他的論理和 |
xor |
xor(T,T) |
FALSE |
論理ベクトルの作成およびその演算と結果を次に示す。
> Lx<-c(T,T,F,F)
> Ly<-c(T,F,F,T)
> !(Lx)
[1] FALSE FALSE TRUE TRUE
> Lx & Ly
[1] TRUE FALSE FALSE FALSE
> Lx && Ly
[1] TRUE
> Lx | Ly
[1] TRUE TRUE
FALSE TRUE
> Lx || Ly
[1] TRUE
> xor(Lx,Ly)
[1] FALSE TRUE FALSE TRUE
以上の例からわかるように、&, |, はベクトルのすべての要素について論理演算を行うが、&&, ||はベクトルにおける最初の要素の間の論理演算が成り立つと、その次の演算は行わない。
3.行列の演算
(1)行列の加、減算
同じ数の行と列をもつ複数の行列の間には加、減算を行うことが可能である。行列の加、減算は、行列の対応する位置の要素について次のように演算を行う。
![]()
![]()
Rでは、行列A、Bの加、減算は算術演算の表記と同じである。
> A+B
[,1] [,2]
[1,] 5 4
[2,] 4 8
> A-B
[,1] [,2]
[1,] -3
-2
[2,] 0 0
(2)行列の乗算
行列の乗算には、算術演算のように対応する行列の要素の間に乗算を行う演算と線形代数で定義されている積演算がある。
@行列の算術乗算
ここでいう行列の算術演算とは、行列の要素の間に算術乗算を行うことである。前節に用いた行列A、Bを用いたその計算のコマンドと実行結果を次に示す。
> A*B
[,1] [,2]
[1,] 4 3
[2,] 4 16
A行列のスカラー倍
行列Aの
倍は、行列Aのすべての要素を
倍にする。これを行列のスカラー倍という。スカラー (scalar) は行列ではなく数値であることである。例えば、行列Aの2倍は
![]()
となる。Rでの計算の書き式と結果を示す。
> 2*A
[,1] [,2]
[1,] 2 2
[2,] 4 8
B行列の積演算
Rでの行列の積演算は、3種類(行列積、行列クロス積crossprod、行列外積outer) があるが、ここでは行列積のみについて説明する。例えば、次のような行列A、Dがあるとする。
、
行列の積演算のルールは、左辺の行列における行の要素と右辺の行列の列に対応する要素の積の和を行列の要素とする。
例えば、上記のAの第1行は
で、Dの第1列は
である。
が積行列ADの第1行、第1列の要素となる。

![]()
=
=![]()
行列の積演算の前提条件は、左辺の行列の列数が右辺の行列の行数と一致することである。この条件を満たさないと行列の積演算は成り立たない。行列Aは2列、Dは2行であるので、行列Aと行列Dの積演算は可能であるが、積演算DAは成り立たない。これはDが3列で、Aが2行であるからである。左辺の行列が
行、右辺の行列が
列の場合、行列の積演算で得られた新たの行列は
行
列となる。
Rでは、コマンド%*%で行列の積演算を行う。行列Dの作成と積演算AD、及びその結果を次に示す。
> D<-matrix(0,2,3)
> D[1,]<-c(4,3,2)
> D[2,]<-c(2,4,1)
> A%*%D
[,1] [,2] [,3]
[1,] 6 7 3
[2,] 16 22
8
(3)単位行列と逆行列
行列の主対角線の要素がすべて1で、その以外の要素がゼロである行列を単位行列という。単位行列は、一般的にI、あるいはEで表す。ここではIを用いることにする。


算術演算では、
に
を乗じると
となる。これと似たように、行列にある行列を乗じると単位行列になる場合がある。
![]()
このとき、行列Zは行列Aの逆行列と呼び、
で表示する。その逆も言える。
![]()
ある行列の逆行列を求める計算は行列の積演算より煩雑である。ここではその計算の規則の説明は省略する。ほとんどの線形代数に関する専門書には逆行列の計算方法が説明されている。
R言語での逆行列を求める関数はsolveである。行列
![]()
の逆行列は次のように求める。
> solve(A)
[,1] [,2]
[1,] 2 -0.5
[2,] -1 0.5
行列Aとその逆行列の積は次に示すように単位行列になる。
>A%*%solve(A)
[,1] [,2]
[1,] 1 0
[2,] 0 1
> solve(A)%*%A
[,1] [,2]
[1,] 1 0
[2,] 0 1
(4) 固有値
行
列の正方行列
と要素が同時にゼロではない
次元のベクトル
について、
![]()
が成り立つとき、スカラー係数λを行列
の固有値(eigen value)、
を固有ベクトル(eigen vector)と言う。固有値、固有ベクトルはデータ解析に多く用いられている。Rには正方行列の固有値、固有ベクトルを求める関数eigenが用意されている。例として、次の行列
の固有値、固有ベクトルを求めてみよう。
![]()
>A<-matrix(c(1,2,1,4),2,2)
> eigen(A)
$values
[1] 4.5615528 0.4384472
$vectors
[,1] [,2]
[1,] -0.2703230 -0.8719282
[2,] -0.9627697
0.4896337