[連載]フリーソフトによるデータ解析・マイニング 第2回
Rでのデータの入出力とパッケージ
データ解析・マイニングを行うためには、まずデータをツールに読み込まなければならない。Rでは、実数(numeric)、複素数(complex),文字(character)、論理(logical)値などのデータをベクトル、行列、配列、データフレーム、リストなどの形式で扱うことができる。
Rでは、キーボードによって直接入力する方法と、R外部のファイルからRに読み込む方法がある。
1.直接入力
(1)ベクトル
表1のような、データを入力することを例として説明する。
表1 果物の売上の割合(単位は%)
|
Cherry |
Apple |
Grape |
Banana |
Other |
|
15 |
20 |
25 |
10 |
30 |
Rを起動し、Rのコンソールに
> sales<-c(15,20,25,10,30)
を入力し、[Enter]キーを押すと、salesに一行のデータ15,20,25,10,30が入力される。ここのsalesはデータセットの名前で、他のオブジェクトと区別可能な文字列であれば、どのような文字列にしてもかまわない。例えば、「hanbai」、「販売」とすることもできる。コマンドラインの”>”は改行するたびに自動的に現れるコマンドラインの開始記号であるので、入力する必要はない。
コマンドラインのc()はデータをまとめる関数と呼ぶ。記述の便利のため以下には丸括弧を省略する。関数cを用いてデータを入力する際、入力のデータは単位ごとに半角のカンマ「,」で区切る。半角の不等記号「<」とハイフン「-」をつないだ「<-」の左側はオブジェクトの名前,右側は付値 (assignment)する内容である。Rで使用可能ないくつかの付値の書式を以下に示す。これらの異なる表記形式の付値機能は等価である。
>sales<-c(15,20,25,10,30)
>sales=c(15,20,25,10,30)
>assign(“sales”,c(15,20,25,10,30))
>c(15,20,25,10,30)-> sales
このような1行、あるいは1列のデータをベクトルと呼び、行の場合は行ベクトル、列の場合は列ベクトルと呼ぶ。
ベクトルsalesは5つのデータを一つのデータセットとしてまとめている。この場合、ベクトルsalesの長さは5である。Rではベクトルの長さを、関数lengthを用いて求めることができる。
>
length(sales)
[1] 5
連続する自然数を入力する際には、「始まる値:終わる値」の書式でデータを入力することも可能である。例えば、1から10までの自然数をyに付値するのには、y<-1:10 あるいはy<-c(1:10)のように書く。
文字列の入力は、文字列を半角の ””で囲む。文字列のデータは行、列の名前、ラベルとしてよく用いられる。例えば、表1の果物の種類のベクトルは次のように作成することができる。
>fruits<-c(“Cherry”,”Apple”,”Grape”,“Banana”,”Other”)
文字列ベクトルと数値ベクトルの長さが同じである場合、文字ベクトルを数値ベクトルの要素の名前として付け加えることができる。例えば、入力した数値ベクトルsalesと文字ベクトルfruitsの長さは同じである。fruitsをsalesのラベルにしたいときには、関数namesを次のように用いる。
> names(sales)<-fruits
> sales
Cherry Apple Grape Banana
Other
15 20 25 10 30
(2)行列
長さが同じである複数のベクトルを一つのデータセットとしてまとめた
行
列のデータセットを行列(matrix、マトリックス)と呼ぶ。
行列の作成と入力の手順は、まず行列のサイズを定義し、次に行列の要素を行別、あるいは列別にベクトルの場合と同じのように入力する。例えば、表2のようなデータがあるとする。
表2 果物の売上の割合(単位は%)
|
|
Cherry |
Apple |
Grape |
Banana |
Other
|
|
A |
15 |
20 |
25 |
10 |
30 |
|
B |
10 |
25 |
20 |
25 |
20 |
表2のデータは2行5列であるので、 まず2行5列の行列を定義する。
>sales2<-matrix(0,2,5)
sales2はオブジェクトの名前、matrixは行列を作成する関数で、引数0は行列の要素がすべてゼロで、2は行の数、5は列の数である。つまり、sales2は各要素がゼロである2行5列の行列である。
sales2へのデータの入力は行単位、あるいは列単位でできる。第1行にデータ15,20,25,10,30を入力したいときには、ベクトルの場合と同じく次のように入力する。
>sales2[1,]<-c(15,20,25,10,30)
ここの[1,]は行列の第1行を指す。よって第2行の場合は[2,]となる。第1列の場合は[,1]、第2列の場合は[,2]で指定する。第1行と同じく第2行にデータを入力する。
>sales2[2,]<-c(10,25,20,25,20)
> sales2
[,1] [,2] [,3] [,4] [,5]
[1,] 15
20 25 10 30
[2,] 10
25 20 25 20
行列が何行何列により構成されているかというサイズについては関数dimを用いて求めることが可能である。
> dim(sales2)
[1] 2 5
行列の中のデータは行番号と列の番号(添字)で参照することができる。例えば、sales2の第2行、3列の要素は、sales2[2,3]で呼び出すことが可能である。
> sales2[2,3]
[1] 20
第2行、3列の要素20を30に置き換えるのには次のように行う。
> sales2[2,3]<-30
関数rownames, colnamesを用いて行、列に名前を加えることができる。例として、入力した表2のデータsales2に行、列の名前を付けることにする。果物の種類に関する文字列のベクトルはすでにfruitsとして作成しているので、それを用いる。
> colnames(sales2)<-fruits
> rownames(sales2)<-c("A","B")
> sales2
Cherry Apple Grape Banana
Other
A 15 20 25 10 30
B 10 25 20 25 20
(3)配列
表2では売上の割合を示しているが、果物屋では、売上、仕入れの価額、売り出しの価額、種類別の利益のように異なる視点からデータを集計することも考えられる。

図1 配列の構造のイメージ
このような複数のデータ表を一つのオブジェクトとしてまとめたものを配列(分割表)という。配列は、行列の拡張である。配列は関数arrayを用いて作成する。
> array(1:30,c(2,5,3))
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8
10
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 11
13 15 17 19
[2,] 12
14 16 18 20
, , 3
[,1] [,2] [,3] [,4] [,5]
[1,] 21
23 25 27 29
[2,] 22
24 26 28 30
(4)リスト
リストは、ベクトル、行列、配列、リストなど異なる型を一つのオブジェクトとして扱うことが可能なオブジェクトである。リストは関数listを用いて作成する。
> L1<-list(c(1:8),c("A","B"),matrix(1:12,2,6))
> L1[1]
[[1]]
[1] 1 2 3 4 5 6 7 8
> L1[2]
[[1]]
[1] "A" "B"
> L1[3]
[[1]]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 5 7 9
11
[2,] 2 4 6 8
10 12
2.データをファイルから読み込む
データファイルにはさまざまな形式があるが最も広く使用されているのはテキスト形式である。テキスト形式ファイルとは、保存されたファイルの拡張子がtxtになっているファイルである。Rの外部のテキストファイルをRに読み込むのには、関数read.table、scanがよく使用されている。
(1)read.tableによる読み込み
関数read.tableは小、中規模のデータ表をRに読み込むのに適している。例えば、図2のように個々のデータをスペース、あるいはTabキーで区切り、CドライブのフォルダRWにdata1.txtという名前で保存したとする。

図2 テキストデータファイルの作成画面
次のコマンドを実行すると、CドライブのフォルダRWの中に保存しているdata1.txtがdata1という名前でRに読み込まれる。
>data1<-read.table(“C:/RW/data1.txt”,header=T,row.names=1)
引数header=T(あるいはheader=TRUE)は、データの第1行が列の名前であることを示し、row.names=1は第1列が行の名前であることを示す。行、あるいは列の名前がない場合は、対応する引数を省略する。
テキストファイルの中のデータの要素がカンマで区切られ、data.txtとして保存された場合、read.tableで読み込むのには引数「sep=”,”」を次のように追加する。
>read.table(“C:/RW/data.txt”,sep=”,”)
関数read.tableを用いて読み込んだデータを、データフレーム(data frame)と言う。データフレーム型のデータ構造は行列に似ているが、数値、文字、論理値が混在しているデータを扱うことができるのが大きな特徴である。データフレームはオブジェクトの一つの属性である。
Rには、表計算ソフトExcelで作成したCSV形式のファイルはを読み込む関数read.csvが用意されている。
関数read.tableはデータを読み込むのには非常に便利であるが、大量のデータの場合には以下で説明する関数scanと比較すると効率がよくない。
(2)関数scanによる読み込み
関数scanは、大規模のデータセットをRに読み込むのに適している。
例えば、データが図3のように数値のみにより構成され、CドライブのフォルダRWにdata2.txtとして保存されたとする。関数scanの使用例を次に示す。

図3 data2のテキストファイル
> scan("C:/RW/data2.txt")
Read 12 items
[1] 1 2 3 4 5 6 7 8 9 5 2 1
もし、テキストファイルのデータがカンマで区切られた場合は、read.tableを用いるときと同じく、関数scanの中に引数「sep=”,”」を加える。関数scanを用いるとデータが1行に読み込まれる。よって、関数scanで読み込まれたデータを解析するためには、必要な形式への変換が必要である。
例えば、読み込んだ12の数値データを3行4列の行列に変更したいときには、関数matrixとscanを次のように組み合わせればよい。
>matrix(scan("C:/RW/data2.txt"),3,4)
Read 12 items
[,1] [,2] [,3] [,4]
[1,] 1 4 7 5
[2,] 2 5 8 2
[3,] 3 6 9 1
data2.txtでは、データが横に1、2、3の順になっているが、作成した行列はデータが縦に1、2、3の順になっている。
関数matrixに引数byrow=T (あるいはbyrow=TRUE)
を加えるとデータが横の順に並べられた行列になる。
>data2<- scan("C:/RW/data2.txt")
>data2.M<-matrix(data2,3,4,byrow=T)
>data2.M
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 5 2 1
データに数値、文字が混在している場合、関数scanを用いて読み込むのには、列ごとにデータの属性を明記する必要がある。例えば、下記のようなデータdata3.txtがあるとする.
A 1 5
B 2 4
C 3 3
このデータを、関数scanを用いて読み込むときには、listを用いて列のデータの属性を明記する.文字の場合は””、数値の場合は0で表記する。
>data3<- scan("C:/RW/data3.txt",list(label="",x=0,
y=0))
このように読み込まれたデータはリストである。R内部の行列、データフレーム、リストはお互いに変換することができる。行列、リストをデータフレームに変換するのには関数data.frameを用いる。
> data.frame(data3)
label x y
1 A 1 5
2 B 2
4
3 C 3 3
>
data2.F<-data.frame(data2.M)
>
data2.F
X1
X2 X3 X4
1 1
2 3 4
2 5
6 7 8
3 9 5
2 1
データフレームを行列へ変換するのには関数as.matrix、あるいはdata.matrixを用いる。
> as.matrix(data2.F)
X1 X2 X3 X4
1 1 2 3
4
2 5 6 7
8
3 9 5 2
1
画面上に返されたデータの構造だけでは、データフレームであるか、行列であるか初心者には見分けが付かない場合もある。
関数classを用いるとオブジェクトの属性を確認することができる。
> class(data3)
[1] "list"
> class(data2.M)
[1]
"matrix"
> class(data2.F)
[1] "data.frame"
> class(fruits)
[1] "character"
> class(sales)
[1] "numeric"
> class(c(TRUE,FALSE))
[1] "logical"
3.データの出力
計算結果が少量であれば、キーボードで打ち移すか、コンソールに出力された結果をコピーし、レポートや論文の文章の中に貼り付ければよいが、出力の結果が大量でかつ他のツールで利用したいときには、ファイルとして出力しておくと便利である。
RのデータをテキストファイルとしてRの外に出力する関数はwrite、write.table、sink
などがある。
例えば、Rに下記のようなデータがrdataというオブジェクトの名前で作成されたとする。
1
3 5 7 9
2
4 6 8 10
コマンド
>write(rdata,”C:/RW/OutData.txt”)
によりrdataがOutData.txtという名前でCドライブのフォルダRWの中に出力される。
OutData.txtとrdataは、データの並びの方向が異なる。出力されたデータとRの中のデータの並び方向を一致させるためにはt関数を用いてRの中のデータを転置(回転)した後出力する。転置の関数はtである。
>write(t(rdata),”C:/RW/
OutData.txt ”)
これでRの内部のデータとRの外部に出力されたデータの並び方が同じになる。また、出力する際、データの列の数を指定することも可能である。例えば、次のように書くとデータが2列で出力される。
>write(t(rdata),”C:/RW/
OutData.txt”,columns=2)
また出力されたデータファイルOutData.txtに他のデータを後で追加したいときには、下記のように引数append=TRUEを加えておく必要がある。
>write(rdata2,”C:/RW/OutData.txt”,
append=TRUE)
関数write.tableはデータフレームを出力する関数である。データフレームをwrite.tableで出力すると、文字列は””で囲まれ、数値データはそのまま出力される。行列をwrite.tableを用いて出力するとすべてのデータが文字列として扱われる。関数write.tableの書式はwriteの書式と同じである。
関数sinkはコンソールに返される内容をファイルとして出力する関数である。
>
sink("C:/RW/temp.txt")
>data2.M
>data2.F
> sink()
この3行のコマンドにより、data2.M、data2.FがCドライブのフォルダRWの中にtemp.txtというファイル名で出力される。
関数sinkの書式は、出力が開始するコマンドsink(“****”)と出力を終了するコマンドsink()がペアとなっている。関数sinkでもwriteと同じく、引数append=TRUEを用いると、出力したファイルに、後でデータを追加することができる。
また、パッケージforeignを用いると、SAS、SPSS、Stata、S-PLUSのファイル形式からのデータを読み込むことが可能である。
4.パッケージ
Rにおける関数はRの本体に組み込まれた基礎部分(base)とパッケージ(package)に分けられる。パッケージには最新の研究結果が一般の市販のソフトより早く入手できるものもあり、現段階では200を超えるパッケージが利用可能である。
Rでパッケージを利用するためには、次の2段階の作業が必要である。
(1) パッケージをインストールする
(2) パッケージを読み込む
Rをインストールする際、頻繁に使用されると思われる20数種類のパッケージが自動的にインストールされる。後述の図4のSelect oneダイアログボックスのリストからインストールされているパッケージを確認することができる。リストアップされていないパッケージをインストールする方法は2とおりある。
(1) インターネットが接続されている環境で、メニューのPackages⇒Install Package(s) from CRAN (あるいはInstall
Package(s) from Bioconductor) をクリックし、Selectダイアログボックスから必要となるパッケージをクリックするとダウンロード・インストールが始まる。インストールが終了するとコンソール画面にダウンロードしたファイルを削除するかどうかを尋ねる「Delete
downloaded files (y/N)?」というメッセージが返される。いずれかを選択してもよい。ここでは推奨されている"N"を入力してEnterキーを押すことにする。
(2) 事前にダウンロード、あるいはコピーしたパッケージのZip(ファイルの圧縮の形式) ファイルがローカルに保存されている場合は、Packages⇒Install Package(s) from local zip filesをクリックし、保存されているファイルを読み込むことで、パッケージをRにインストールすることができる。
パッケージの読み込みは、メニューを用いる方法と、コマンドを用いる方法がある。 メニューによる方法は、メニューからパッケージ(packages)を開き、パッケージの読み込み(load
package)をクリックし、Select oneダイアログボックスを開き、選択画面から必要となるパッケージを選択し、[OK]ボタンをクリックする。Select oneダイアログボックスを図4に示す。
コマンドによる方法は、コンソール画面にlibrary(パッケージの名)を入力し、実行する。
![]()
図18 パッケージの選択画面
