ExcelからRにデータを取り込むために先賢が努力してきた
Rの標準ではExcelファイルを読み込めないのでした。しかし、企業では多くのデータがExcelファイルとして存在します。これを取り込むため先賢が多大な努力をなさってきました。
xlsx取り扱いでトラブルが多いようです
xlsは専用バイナリでしたが、xlsxはOpenXMLのzipになっています。そのため、xlsx取り扱いの際には
1. XMLを正しく処理できる環境
2. 正しくzip圧縮する環境
が揃っていないとエラーが起こるようです。
まずはサンプルを
例えば、Excelファイル「RTest.xls」の「社員名簿」シートがあります。これをc:/wrk/に置くことにして読み書きを試します。
社員名簿サンプルExcelファイル作成コードRODBCパッケージ
CRAN - Package RODBC
Excel2007以降はMacではDriverがなく対応していません。Windowsでもxlsxを書き出すとExcelやreadxl::read_excelで読み込めないことがありました。時代遅れだとも言われています。
しかし、Excel以外のデータソースも利用するのであればお世話になるでしょう。
私は、sqlQuery()関数によりExcelからSQLでデータを読み込めるので重宝しています。
library(RODBC) fid <- odbcConnectExcel("C:/wrk/Rtest.xls") #ファイル指定 #fid<-odbcConnectExcel2007("C:/wrk/Rtest.xlsx")#ファイル指定 df <- sqlFetch(fid,"社員名簿") # シート指定 close(fid) #接続を閉じる
readxlパッケージ
CRAN - Package readxl
C++で書かれた高速読み込みパッケージ。
人によってはDEFINEDNAME: ・・・・と無駄に表示されます。
library(readxl) read_excel("c:/wrk/Rtest.xls")
gdataパッケージ
CRAN - Package gdata
事実上読み込み専用です。
gdata はPerl環境が必要です。普通、LinuxやMacにはインストールされているでしょうが、Windowsだと頑張ってインストールしなくてはいけないでしょう。
xls,xlsxどちらも読み込めます。
write.fwfは標準関数write.tableのwrapperのようでテキスト形式しか書き出せないようです。拡張子がxls,xlsxなのでExcelで起動はできますが。
library(gdata) Eployees=read.xls("c:/wrk/Rtest.xlsx", sheet=1) write.fwf(Employees,"c:/wrk/Rtest.xlsx") #shell("Notepad.exe c:/wrk/Rtest.xlsx") # if Needed
テキストファイルになっていれば Notepad.exe で見ることができます。確認してみるとよいでしょう。
XLConnectパッケージ
CRAN - Package XLConnect
読み書き両対応です。
多くのパッケージ同様にJava依存パッケージです。巨大なデータセットを取り扱うと遅かったりエラーに直面することも。私はChromeユーザーなのでJAVAのアップデートをフォローしておらず、なるべくならJAVAフリーのパッケージが好ましいです
xls,xlsxどちらも読み込めます。行・列どちらも範囲指定できるので便利です。
書き込みはとても多才で、単純なデータ書き出しの他に、文字色や背景色指定、セル幅指定、オートフィルタ、ウィンドウ枠固定、範囲名定義、グラフ貼付など覚えきれません。
library(XLConnect) # Sample 1 to read casually Employees =readWorksheetFromFile("c:/wrk/Rtest.xls",sheet = "社員名簿") # Sample 2 to read partial area Employees =readWorksheetFromFile("c:/wrk/Rtest.xls",sheet = "社員名簿", header = TRUE,startRow=3,endRow=10) # Sample 3 to write dataframe to Excel file wb <- loadWorkbook("c:/wrk/Rtest.xls", create = TRUE) createSheet(wb, name = "employees") writeWorksheet(object = wb, data = data.frame(社員名簿), sheet = "社員名簿") saveWorkbook(wb, "c:/wrk/Rtest.xlsx") shell("c:/wrk/Rtest.xlsx")
ここではデータだけを書き出すサンプルにしましたが、下線を引いたりなんだりといろいろできるのが素晴らしいです。仕事の自動化には大いに役立ちます。
詳細機能はマニュアルをご参照を。
xlsReadWriteパッケージ
CRAN - Package xlsReadWrite
CRANのrepositoriesから削除され、過去のzipが残っています。
読み書き両対応です。
読み書きは速いのですが、xlsx には対応していません。
ソースはPascalで書かれているそうです。CRAN推奨言語ではないため外部サイトから、xls.getshlib()でshlibをダウンロードする必要があるとのことです。
Windows専用です。
library(xlsReadWrite) xls.getshlib() df = read.xls("c:/wrk/Rtest.xls", sheet = "社員名簿") write.xls( df, "c:/wrk/Rtest.xls", colNames = TRUE, sheet = "社員名簿", from = 1 ) shell("c:/wrk/Rtest.xls")
xlsxパッケージ
CRAN - Package xlsx
読み書き両対応です。
これもJAVAに依存するのですが、多才です。
単純なデータ書き出しの他に、文字色や背景色、セル幅指定、シートにタイトル挿入など多彩な機能を実現していて使い切るのは大変そうです。
それらを使わない場合にはwritexlsx,writexlsx2,readxlsx,readxlsx2で簡単に読み書きできます。
library(xlsx) read.xlsx2("c:/wrk/Rtest.xlsx", 1) write.xlsx2(Employees, "c:/wrk/Rtest.xlsx", row.names=F) shell("c:/wrk/Rtest.xlsx")
xlsx2の方が速いですが、integer、numeric、character以外の型はcharacter型に変換されるそうです。
WriteXLSパッケージ
CRAN - Package WriteXLS
名前の通り書き出し専用です。
とても使い方の簡単なパッケージWriteXLSというものがあります。こちらはJAVAではなくPerlが必要です。そのせいかJAVA依存パッケージでは書き出せないような大量のデータも書き出すことができます。
library(WriteXLS) WriteXLS(社員名簿, "c:/wrk/Rtest.xlsx") shell("c:/wrk/Rtest.xlsx")
openxlsxパッケージ
CRAN - Package openxlsx
JAVAに依存しないExcel読み書きパッケージだそうです。
xlsには対応していません。
Windows版はRtoolsのzip.exeを使っているようです。Rtoolsをインストールしていないとうまく動作しないかもしれません。
同様にMac版はXcodeをインストールしていないとうまく動作しないかもしれません。
#Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") library(openxlsx) Employees<-read.xlsx("c:/wrk/Rtest.xlsx") write.xlsx(Employees,file="c:/wrk/Rtest.xlsx") openXL("c:/wrk/Rtest.xlsx")
このように多数のパッケージがあり、それぞれ特徴があり悩むところです。
xls,xlsxの必要性、JAVA環境やPerl環境の有無などを判断材料にするといったところでしょうか。