一所懸命に手抜きする

デスクワークばかりのスポーツ嫌いで50歳も過ぎ、いよいよ足腰に衰えを感じつつある昨今。

Excelからデータを読み込むR関数(3)書き込みも

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環境が必要です。普通、LinuxMacにはインストールされているでしょうが、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環境の有無などを判断材料にするといったところでしょうか。