[連載]フリーソフトによるデータ解析・マイニング 3回

Rでのデータの編集と演算

 


データの解析や処理を行うためには、データについて、その構造の確認や編集などが必要である場合がある。

 

1.データの編集

(1)データのサイズの確認

ここでは入力されているデータsales2を用いて説明する。データsales225列で、データフレーム型で入力されている。

 

> 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には、データ編集のための関数editedit.data.framedata.entryfixなどがある。 editは「テキストエディタの起動」、edit.data.frameは「データフレームと行列の編集」、data.entryは「データ入力のための表計算ソフト風のインタフェイス」、fixは「オブジェクトの編集」用として作成されている。しかし、最近のバージョンでは、データオブジェクトが作成されている場合は、上記の関数のいずれもデータを表計算ソフト風のエディタで編集を行うことができるようになっている。例えば、コマンド

 

>edit(sales2)

 

を実行すると、次のページ図1のような編集画面が開かれる。編集画面はExcelほど便利ではないが、セル単位で編集が可能である。 

 

1 データ編集エディタの画面

 

 関数editで編集したデータを保存するためには、付値の手続きが必要である。sales2editで編集し、その結果をtempという名前で保存したいとき、sales2に上書きしたいときの例を次に示す。

 

>temp<-edit(sales2)

>sales2<-edit(sales2)

 

 関数editを用いてデータセットの行、あるいは列を付け加えたいときには、データセットをデータフレーム型にした方がよい。

 関数fixを用いてデータを編集すると、編集された新しい結果が直接上書きされるので付値の手順は必要としない。

このように、異なるデータ編集用の関数はそれぞれ特徴を持っている。

 

(3)データセットの結合

データフレームや行列などの行の追加や列の追加が必要な場合がある。Rにはデータフレームおよび行列の結合の関数rbindcbindがある。例えば、データフレームsales2の最後の行の後にデータ2030152015を追加したいときには次のように行う。

 

> 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

 

関数rbindcbindは同じ長さの行、あるいは列のデータフレームや行列を結合することが可能である。例えば、行列ABがあるとする。

  

 データ行列ABの作成と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

減算

32

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に論理演算の名称と記号との対応関係および例を示す。表の中のTTRUEFFALSEの略である。


 

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では、行列ABの加、減算は算術演算の表記と同じである。

> A+B

     [,1]  [,2]

[1,]    5    4

[2,]    4    8

> A-B

     [,1]  [,2]

[1,]   -3   -2

[2,]    0    0

 

(2)行列の乗算

 行列の乗算には、算術演算のように対応する行列の要素の間に乗算を行う演算と線形代数で定義されている積演算がある。

 

@行列の算術乗算

 ここでいう行列の算術演算とは、行列の要素の間に算術乗算を行うことである。前節に用いた行列ABを用いたその計算のコマンドと実行結果を次に示す。

 

> A*B

     [,1]                [,2]

[1,]    4    3

[2,]    4   16

 

A行列のスカラー倍

行列A倍は、行列Aのすべての要素を倍にする。これを行列のスカラー倍という。スカラー (scalar) は行列ではなく数値であることである。例えば、行列A2倍は

となる。Rでの計算の書き式と結果を示す。

 

> 2*A

     [,1]  [,2]

[1,]    2    2

[2,]    4    8

 

B行列の積演算

 Rでの行列の積演算は、3種類(行列積、行列クロス積crossprod、行列外積outer) があるが、ここでは行列積のみについて説明する。例えば、次のような行列ADがあるとする。

 

行列の積演算のルールは、左辺の行列における行の要素と右辺の行列の列に対応する要素の積の和を行列の要素とする。

例えば、上記のAの第1行はで、Dの第1列はである。が積行列ADの第1行、第1列の要素となる。

= 

=

行列の積演算の前提条件は、左辺の行列の列数が右辺の行列の行数と一致することである。この条件を満たさないと行列の積演算は成り立たない。行列A2D2であるので、行列Aと行列Dの積演算は可能であるが、積演算DAは成り立たない。これはD3列で、A2行であるからである。左辺の行列が行、右辺の行列が列の場合、行列の積演算で得られた新たの行列は列となる。

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

 

行列が*次元のとき、固有値と固有ベクトルの最多数は個である。固有値(values)は先頭から数え第1固有値、第2固有値・・・第固有値、固有ベクトル(vectors)は列単位で左から第1固有ベクトル、第2固有ベクトル・・・第ベクトルと呼ぶ。

得られた固有値と固有ベクトルを用いて、固有値、固有ベクトルの定義に用いた等式が成り立つかどうかを確認することができる。説明の便利のため、固有値をlamuda、固有ベクトルをXと言うオブジェクトの名前にする。

 

 

>lamuda=eigen(A)$values

>X=eigen(A)$vectors

> A%*%X[,1]

          [,1]

[1,] -1.233093

[2,] -4.391725

> lamuda[1]*X[,1]

[1] -1.233093 -4.391725

 

返されている両結果が、縦と横に並べられた形式のこと以外には、対応する値はまったく同じである。これで第1固有値と固有ベクトル用いて場合、等式が成り立つことが確認できた。同じの方法で、第2固有値と固有ベクトルを用いた場合の結果を確認することができる。