Excelデータを読み込む

Rが読み込むデータは機械可読なテキストファイルであるcsvデータが最も親和性が高い。 しかし、Excelのワークシートであるxls形式または最新のxlsx形式のファイルを直接読み込むことも可能である。 そのためには、パッケージ gdata を使う。

以下の例でわかるように、Excelワークシートデータを直接読み込むことができると、csvファイルで気を配った文字コード変換に迷わされることから解放される。

Rライブラリ gdata

Rの[パッケージとデータ]/[パッケージインストーラ]から、gdataを入力して「一覧を取得」。 gdataを選択し、「選択をインストール」で、gdata がインストールされる。

RStudioでは、[Package/Install]から目的のパッケージ名 gdata を正しく入力して[Install]ボタンを押す。 すると、コンソールに次のようにinstall.packages("gdata")コマンドが実行されてダウンロードされたことがわかる。

Rを起動して、gdataライブラリを使うには次のように入力するだけだ。

> library(gdata)
gdataライブラリの詳しい使い方を知りたければ、つぎのようにヘルプを呼び出す。
> ?gdata

Excelワークシートデータの読込

Excelワークシートを直接読み込むには、以下のようにパッケージ gdataの関数 read.xls( ) を使う。

成績データseiseki.xlsは、3枚のシートからなっているワークシートである。 sheet1は半角英数字だけからなる表データ(ただし、3行目から7行目には「別の」小さな表が占めている)、sheet2はラベル行に漢字を使った表データ(1-2行目は空白)、sheet3はsheet1のラベルを全て漢字で表記したものである。

sheet2を読み込む

read.xls( ) で指定したシートを読むにはオプション sheet=シート番号 を使う。 シートは名前でなく番号で識別される。 sheet2は番号であるので、次のようになる。 read.xls( ) では、read.table( )とは違って、ラベル行を使うという header=T オプションは不要だ。 また、読み飛ばす先頭から2行空白は自動的に処理されることにも注意しよう。

> df2 <- read.xls("seiseki.xls",sheet=2)
Wide character in print at /Users/umeko/Library/R/2.13/library/gdata/perl/xls2csv.pl line 262.
> str(df2)
'data.frame':	200 obs. of  6 variables:
 $ 番号: Factor w/ 200 levels "a111","a112",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ 性別: int  0 1 0 1 1 1 1 0 0 0 ...
 $ 英語: int  68 38 51 62 82 44 48 47 77 89 ...
 $ 国語: int  76 62 62 77 69 72 72 64 77 58 ...
 $ 数学: int  71 33 88 52 93 57 66 57 55 25 ...
 $ 平均: logi  NA NA NA NA NA NA ...

日本語が混じっていても、ちゃんと表示してくれることがわかる。 実際、たとえば英語得点の列データにアクセスするためには、次のように記号 $ を使って df2$英語 とすればよい。

> df2$英語
  [1] 68 38 51 62 82 44 48 47 77 89 51 61 73 48 44 74 57 47 60 50 65 46 91 53 83 74 79 45 64 67
 [31] 54 49 72 43 64 44 62 70 51 56 59 53 44 42 37 61 62 28 73 54 60 64 44 67 30 71 69 58 55 87
........
[151] 82 29 60 58 63 62 62 71 97 61 58 85 83 67 53 48 71 75 73 54 53 68 63 40 46 89 57 65 89 47
[181] 68 77 60 49 82 60 46 71 46 60 51 45 74 35 53 71 64 67 71 90

sheet1を読み込む

read.xls( ) のデフォルトのシート番号は「1」であるので、sheet1を読み込むにはsheetオプションは使わない。 read.xls( ) では、read.table( )とは違って、ラベル行を使うという header=T オプションは不要。 ここで重要なのは、先頭から数えて、「空白行を除いた」6行をスキップすると指定することである。

> df1 <- read.xls("seiseki.xlsx",skip=6)
> str(df1)
'data.frame':	200 obs. of  6 variables:
 $ Stnum: Factor w/ 200 levels "a111","a112",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Sex  : int  0 1 0 1 1 1 1 0 0 0 ...
 $ Eng  : int  68 38 51 62 82 44 48 47 77 89 ...
 $ Lang : int  76 62 62 77 69 72 72 64 77 58 ...
 $ Math : int  71 33 88 52 93 57 66 57 55 25 ...
 $ Ave  : logi  NA NA NA NA NA NA ...

sheet3を読み込む

では、漢字の混じったフツウのExcelの3枚目のシートを読み込んでみよう。 上記の2つ場合から、わかるように次のようにする。 sheet=3 と3枚目のシートであることを指定し、先頭から数えて、「空白行を除いた」6行をスキップするわけだ。

> df3 <- read.xls("seiseki.xlsx",sheet=3,skip=6)
> str(df3)
'data.frame':	200 obs. of  6 variables:
 $ 番号バンゴウ: Factor w/ 200 levels "a111","a112",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ 性別セイベツ: int  0 1 0 1 1 1 1 0 0 0 ...
 $ 英語エイゴ  : int  68 38 51 62 82 44 48 47 77 89 ...
 $ 国語コクゴ  : int  76 62 62 77 69 72 72 64 77 58 ...
 $ 数学スウガク: int  71 33 88 52 93 57 66 57 55 25 ...
 $ 平均ヘイキン: logi  NA NA NA NA NA NA ...