Rで解析:記事更新。エクセルの作成と保存が楽ちんです。「XLConnect」パッケージの紹介

Rの解析に役に立つ記事
スポンサーリンク

Rでデータを保存するにはPDFや画像、HTML出力などありますが、余程大きなデータでなければエクセルファイルで保存するのが無難です。そこで、Rからエクセルファイルの作成、読み込みの機能が一通りそろっている「XLConnect」パッケージを紹介します。

紹介する実行コードを確認いただくことで、本パッケージに収録されている機能を使いこなせると思います。ぜひ、この機会に「XLConnect」パッケージを利用ください。

パッケージバージョンは1.0.6です。windows11のR version 4.2.2で確認しています。

xlsxファイルを操作する他のパッケージを参考に紹介します。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("XLConnect")

オリジナル関数「SelectXLS」を紹介

下記コードを実行いただくことで、SelectXLSコマンドでエクセルファイルの保存や読み込みのパスを取得します。内容はコメントを確認してください。保存はsaveWorkbookコマンド、読み込みはreadWorksheetFromFileコマンドと組み合わせる必要があります。

#actionオプション;"save:保存場所の指定(初期値)", "read:読み込むエクセルファイルのパスを取得"
SelectXLS <- function(action = "save"){
  
  #&#12521;&#12452;&#12502;&#12521;&#12522;&#12398;&#35501;&#12415;&#36796;&#12415;
  library("tcltk")
  
  switch(action, save = {
    #&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;
    setwd(paste(as.character(tkchooseDirectory(title = "&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"),
                             sep = "", collapse ="")))},
    read = {
      #&#35501;&#12415;&#36796;&#12416;&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#12497;&#12473;&#12434;GetXLSXPath&#12395;&#26684;&#32013;
      assign("GetXLSXPath", paste0(as.character(tkgetOpenFile(title = "&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",
                                                              filetypes = '{"&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;" {".xlsx" ".xls"}}',
                                                              initialfile = c("*.xlsx", "*.xls")))),
             env = .GlobalEnv)})
}

#&#20351;&#29992;&#20363;
#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#20808;&#25351;&#23450;
SelectXLS("save")
#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;:saveWorkbook&#12467;&#12510;&#12531;&#12489;
saveWorkbook(XLData)
#&#20316;&#26989;&#12501;&#12457;&#12523;&#12480;&#12398;&#30906;&#35469;
#getwd()

#&#35501;&#12415;&#36796;&#12416;&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#12497;&#12473;&#12434;GetXLSXPath&#12395;&#26684;&#32013;
#&#12461;&#12515;&#12531;&#12475;&#12523;&#12391;GetXLSXPath&#12399;&#31354;&#12395;&#12394;&#12426;&#12414;&#12377;
SelectXLS("read")
#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;:readWorksheetFromFile&#12467;&#12510;&#12531;&#12489;
ReadData <- readWorksheetFromFile(GetXLSXPath, sheet = 1)
#&#12501;&#12449;&#12452;&#12523;&#12497;&#12473;&#12398;&#34920;&#31034;
#GetXLSXPath
########

エクセルファイルの作成と保存コマンド

実行することで、冒頭画像のエクセルファイルを作成し保存することができます。セルの固定、オートフィル、セルの塗りつぶし、グラフ画像の挿入などが可能です。詳細はコメントを確認してください。なお、XLCオブジェクト一覧は記事最下部にまとめています。

#&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#35501;&#12415;&#36796;&#12415;
library("XLConnect")

###&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20986;&#21147;####
#&#12487;&#12540;&#12479;&#20363;&#12398;&#20316;&#25104;
TestData <- data.frame(Group = I(paste0("TEST&#12390;&#12377;&#12392;", 1:10)),
                          Data = 1:10)

#&#31354;&#12398;&#12456;&#12463;&#12475;&#12523;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;(&#20197;&#19979;XLData)&#12434;&#20316;&#25104;:loadWorkbook&#12467;&#12510;&#12531;&#12489;
#loadWorkbook("&#12501;&#12449;&#12452;&#12523;&#21517;.xlsx or .xls", create = &#12501;&#12449;&#12452;&#12523;&#12398;&#20316;&#25104;:TRUE or FALSE)
XLData <- loadWorkbook("TEST.xlsx", create = TRUE)

#XLData&#12395;&#12471;&#12540;&#12488;&#12434;&#20316;&#25104;:createSheet&#12467;&#12510;&#12531;&#12489;
#createSheet(&#12456;&#12463;&#12475;&#12523;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;, name = &#12471;&#12540;&#12488;&#21517;)
createSheet(XLData, name = "&#12390;&#12377;&#12392;")

#&#12471;&#12540;&#12488;&#12479;&#12502;&#12395;&#33394;&#12434;&#35373;&#23450;:setSheetColor&#12467;&#12510;&#12531;&#12489;
#color&#12399;XLC&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12391;&#25351;&#23450;&#12375;&#12414;&#12377;, &#30465;&#30053;&#34920;&#35352;&#12391;&#12418;&#21487;&#33021;&#12391;&#12377;
#&#35352;&#20107;&#26368;&#19979;&#37096;XLC&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#19968;&#35239;&#12434;&#21442;&#29031;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;
setSheetColor(XLData, sheet = 1, color = 14)

#&#20316;&#25104;&#12375;&#12383;&#12471;&#12540;&#12488;&#12395;&#12487;&#12540;&#12479;&#12434;&#26360;&#12365;&#36796;&#12416;:writeWorksheet&#12467;&#12510;&#12531;&#12489;
#writeWorksheet(&#12456;&#12463;&#12475;&#12523;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;, data = &#26360;&#12365;&#36796;&#12416;&#12487;&#12540;&#12479;,
#               sheet = &#12487;&#12540;&#12479;&#12434;&#26360;&#12365;&#36796;&#12416;&#12471;&#12540;&#12488;&#21517; or &#12471;&#12540;&#12488;&#30058;&#21495;,
#               startRow = &#12487;&#12540;&#12479;&#26360;&#12365;&#36796;&#12415;&#38283;&#22987;&#21015;:&#21021;&#26399;&#20516;&#12399;1,
#               startCol = &#12487;&#12540;&#12479;&#26360;&#12365;&#36796;&#12415;&#38283;&#22987;&#34892;:&#21021;&#26399;&#20516;&#12399;1,
#               header = &#12487;&#12540;&#12479;&#21015;&#21517;&#12434;&#26360;&#12365;&#36796;&#12416;&#12363;&#12398;&#25351;&#23450;:TRUE or FALSE)
writeWorksheet(XLData, data = TestData, sheet = 1,
               startRow = 3, startCol = 3, header = TRUE)

#&#12475;&#12523;&#12497;&#12479;&#12540;&#12531;&#12289;&#22615;&#12426;&#12388;&#12406;&#12375;&#12398;&#33394;&#12434;&#35373;&#23450;
#&#35373;&#23450;&#12399;XLC&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12391;&#25351;&#23450;&#12375;&#12414;&#12377;
#createCellStyle&#12467;&#12510;&#12531;&#12489;&#12391;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12434;&#20316;&#25104;&#12375;&#12414;&#12377;
Cstyle = createCellStyle(XLData, name = "&#33394;")
#setFillPattern&#12467;&#12510;&#12531;&#12489;&#12391;&#12497;&#12479;&#12540;&#12531;&#12434;&#25351;&#23450;&#12375;&#12414;&#12377;
setFillPattern(Cstyle, fill = XLC$FILL.FINE_DOTS)
#setFillForegroundColor&#12467;&#12510;&#12531;&#12489;&#12391;&#12475;&#12523;&#12398;&#22615;&#12426;&#12388;&#12406;&#12375;&#12398;&#33394;&#12434;&#35373;&#23450;&#12375;&#12414;&#12377;
setFillForegroundColor(Cstyle, color = XLC$COLOR.GREEN)
#setCellStyle&#12467;&#12510;&#12531;&#12489;&#12391;&#12475;&#12523;&#12395;&#36969;&#24540;&#12375;&#12414;&#12377;
setCellStyle(XLData, sheet = 1, row = 4:10, col = 3,
             cellstyle = Cstyle)

###&#12371;&#12435;&#12394;&#12371;&#12392;&#12418;&#12391;&#12365;&#12414;&#12377;#####
#&#20363;&#12360;&#12400;Data&#21015;&#12398;2&#12398;&#20493;&#25968;&#12434;&#36196;&#12367;&#22615;&#12427;
#createCellStyle&#12467;&#12510;&#12531;&#12489;&#12391;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12434;&#20316;&#25104;&#12375;&#12414;&#12377;
Cstyle2 = createCellStyle(XLData, name = "2&#12398;&#20493;&#25968;")
#setFillForegroundColor&#12467;&#12510;&#12531;&#12489;&#12391;&#12475;&#12523;&#12398;&#22615;&#12426;&#12388;&#12406;&#12375;&#12398;&#33394;&#12434;&#35373;&#23450;&#12375;&#12414;&#12377;
setFillForegroundColor(Cstyle2, color = XLC$COLOR.RED)
#setFillPattern&#12467;&#12510;&#12531;&#12489;&#12391;&#12409;&#12383;&#22615;&#12426;&#12434;&#35373;&#23450;
setFillPattern(Cstyle2, fill = XLC$FILL.SOLID_FOREGROUND)
#setBorder&#12467;&#12510;&#12531;&#12489;&#12391;&#26528;&#32218;&#12434;&#25551;&#20889;
#side&#12458;&#12503;&#12471;&#12519;&#12531;:"bottom", "left", "right", "top", "all"
setBorder(Cstyle2, side = "all", type = XLC$BORDER.MEDIUM, color = XLC$COLOR.CORAL)

#&#20803;&#12487;&#12540;&#12479;&#12391;2&#12398;&#20493;&#25968;&#12398;&#20301;&#32622;&#12434;which&#12391;&#21462;&#24471;&#24460;&#12289;&#12487;&#12540;&#12479;&#12398;&#26360;&#12365;&#36796;&#12415;&#38283;&#22987;&#34892;&#12300;3&#12301;&#12434;&#36861;&#21152;&#12375;&#12390;&#22615;&#12426;&#12388;&#12406;&#12375;&#31684;&#22258;&#12434;&#35519;&#25972;
RowIndex <- which(TestData[, 2] %% 2 == 0) + 3
#&#12475;&#12523;&#12434;&#22615;&#12426;&#12388;&#12406;&#12375;
if (length(RowIndex) != 0){
  setCellStyle(XLData, sheet = 1, row = RowIndex, col = 4,
               cellstyle = Cstyle2)}
########

#&#12458;&#12540;&#12488;&#12501;&#12451;&#12523;&#12479;&#12434;&#35373;&#23450;:setAutoFilter&#12467;&#12510;&#12531;&#12489;
setAutoFilter(XLData, sheet = 1, reference = "D3:D13")

#&#12475;&#12523;&#12398;&#24133;&#12434;&#35373;&#23450;:setColumnWidth&#12467;&#12510;&#12531;&#12489;
setColumnWidth(XLData, sheet = 1, column = 3, width = -1)

#&#12475;&#12523;&#12398;&#22266;&#23450;:createFreezePane&#12467;&#12510;&#12531;&#12489;
#&#22266;&#23450;&#20301;&#32622;&#12399;&#34892;&#21015;&#30058;&#21495;&#12391;&#25351;&#23450;
createFreezePane(XLData, sheet = 1, colSplit = 6, rowSplit = 2)

#&#25351;&#23450;&#12375;&#12383;&#12475;&#12523;&#31684;&#22258;&#12395;&#21517;&#21069;&#12434;&#12388;&#12369;&#12427;:createName&#12467;&#12510;&#12531;&#12489;
#createName(&#12456;&#12463;&#12475;&#12523;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;, name = &#31684;&#22258;&#21517;, fomula = &#31684;&#22258;&#12434;&#25351;&#23450;:&#12471;&#12540;&#12488;&#21517;!$&#34892;$&#21015;)
createName(XLData, name = "&#12390;&#12377;&#12392;", formula = "&#12390;&#12377;&#12392;!$C$4:$D$5", overwrite = TRUE)

###&#12464;&#12521;&#12501;&#12434;&#20316;&#25104;&#12375;&#12456;&#12463;&#12475;&#12523;&#12395;&#36028;&#12426;&#20184;&#12369;&#12427;:addImage&#12467;&#12510;&#12531;&#12489;#####
#createName&#12467;&#12510;&#12531;&#12489;&#12392;&#32068;&#12415;&#21512;&#12431;&#12379;&#12414;&#12377;
#&#20316;&#26989;&#12501;&#12457;&#12523;&#12480;&#12434;&#21462;&#24471;
WDPath <- getwd() 
#&#19968;&#26178;&#12501;&#12457;&#12523;&#12480;&#12395;&#20999;&#12426;&#26367;&#12360;
setwd(tempdir())
#&#22259;&#12398;&#25551;&#20889;&#12289;ggplot2&#12391;&#12418;&#21487;&#33021;&#12391;&#12377;
png("TEST.png", width = 400, height = 400)
plot(TestData[, 2], main = "TEST", col = "red", pch = 17)
dev.off()
#&#12464;&#12521;&#12501;&#12398;&#36028;&#12426;&#20184;&#12369;&#20301;&#32622;&#12434;&#25351;&#23450;
createName(XLData, name = "&#12464;&#12521;&#12501;", formula = "&#12390;&#12377;&#12392;!$F$3", overwrite = TRUE)
#addImage&#12467;&#12510;&#12531;&#12489;&#12391;&#36861;&#21152;:name&#12399;createName&#12391;&#25351;&#23450;&#12375;&#12383;&#21517;&#21069;&#12392;&#12394;&#12426;&#12414;&#12377;
addImage(XLData, filename = "TEST.png", name = "&#12464;&#12521;&#12501;", originalSize = TRUE)
#&#20316;&#26989;&#12501;&#12457;&#12523;&#12480;&#12434;&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#20445;&#23384;&#20808;&#12395;&#25147;&#12377;
setwd(WDPath)
########
#&#12362;&#12414;&#12369;:&#27424;&#25613;&#20516;&#12395;&#20516;&#12434;&#20195;&#20837;&#12377;&#12427;setMissingValue&#12467;&#12510;&#12531;&#12489;#
#setMissingValue(&#12456;&#12463;&#12475;&#12523;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;, value = &#20195;&#20837;&#12377;&#12427;&#20516;)

#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;:saveWorkbook&#12467;&#12510;&#12531;&#12489;
saveWorkbook(XLData)

エクセルファイルの読み込みコマンド

「実行コマンド:エクセルファイルの作成と保存の紹介」で作成したエクセルを使用し、すべてと指定範囲のデータを読み込む方法を紹介します。詳細はコメントを確認してください。

なお、読み込むエクセルのサイズが大きくエラーが出る場合は下記の記事を参考にしてください。
Rとウェブ解析:ファイルサイズが大きくても大丈夫「read.csv」の紹介
https://www.karada-good.net/analyticsr/r-41/

###&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;#####
SelectXLS("read")

#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;:readWorksheetFromFile&#12467;&#12510;&#12531;&#12489;
#readWorksheetFromFile(&#12501;&#12449;&#12452;&#12523;&#12398;&#22580;&#25152;, sheet = &#35501;&#12415;&#36796;&#12416;&#12471;&#12540;&#12488;&#12434;&#25351;&#23450;)
#startRow , startCol , endRow , endCol&#12458;&#12503;&#12471;&#12519;&#12531;&#12391;&#35501;&#12415;&#36796;&#12415;&#31684;&#22258;&#12434;&#25351;&#23450;&#12391;&#12365;&#12414;&#12377;
ReadData <- readWorksheetFromFile(GetXLSXPath, sheet = 1)
Group  Data
1   TEST&#12390;&#12377;&#12392;1    1
2   TEST&#12390;&#12377;&#12392;2    2
3   TEST&#12390;&#12377;&#12392;3    3
4   TEST&#12390;&#12377;&#12392;4    4
5   TEST&#12390;&#12377;&#12392;5    5
6   TEST&#12390;&#12377;&#12392;6    6
7   TEST&#12390;&#12377;&#12392;7    7
8   TEST&#12390;&#12377;&#12392;8    8
9   TEST&#12390;&#12377;&#12392;9    9
10 TEST&#12390;&#12377;&#12392;10   10

#&#12475;&#12523;&#31684;&#22258;&#21517;&#12398;&#12487;&#12540;&#12479;&#12434;&#35501;&#12415;&#36796;&#12415;:readNamedRegionFromFile&#12467;&#12510;&#12531;&#12489;
ReadData <- readNamedRegionFromFile(GetXLSXPath, name = "&#12390;&#12377;&#12392;", header = FALSE)
Col1 Col2
1 TEST&#12390;&#12377;&#12392;1    1
2 TEST&#12390;&#12377;&#12392;2    2

XLCオブジェクト一覧

XLC$BORDER:セル枠線関係、XLC$COLOR:セルの色関係、XLC$COLOR:セルパターン関係です。

XLCオブジェクト名省略設定
XLC$ERROR.WARN"WARN"
XLC$ERROR.STOP"STOP"
XLC$DATA_TYPE.BOOLEAN"BOOLEAN"
XLC$DATA_TYPE.NUMERIC"NUMERIC"
XLC$DATA_TYPE.STRING"STRING"
XLC$DATA_TYPE.DATETIME"DATETIME"
XLC$STYLE_ACTION.XLCONNECT"XLCONNECT"
XLC$STYLE_ACTION.NONE"NONE"
XLC$STYLE_ACTION.PREDEFINED"PREDEFINED"
XLC$STYLE_ACTION.NAME_PREFIX"STYLE_NAME_PREFIX"
XLC$STYLE_ACTION.DATA_FORMAT_ONLY"DATA_FORMAT_ONLY"
XLC$BORDER.DASHED3
XLC$BORDER.DASH_DOT9
XLC$BORDER.DASH_DOT_DOT11
XLC$BORDER.DOTTED7
XLC$BORDER.DOUBLE6
XLC$BORDER.HAIR4
XLC$BORDER.MEDIUM2
XLC$BORDER.MEDIUM_DASHED8
XLC$BORDER.MEDIUM_DASH_DOT10
XLC$BORDER.MEDIUM_DASH_DOT_DOT12
XLC$BORDER.NONE0
XLC$BORDER.SLANTED_DASH_DOT13
XLC$BORDER.THICK5
XLC$BORDER.THIN1
XLC$COLOR.BLACK8
XLC$COLOR.WHITE9
XLC$COLOR.RED10
XLC$COLOR.BRIGHT_GREEN11
XLC$COLOR.BLUE12
XLC$COLOR.YELLOW13
XLC$COLOR.PINK14
XLC$COLOR.TURQUOISE15
XLC$COLOR.DARK_RED16
XLC$COLOR.GREEN17
XLC$COLOR.DARK_BLUE18
XLC$COLOR.DARK_YELLOW19
XLC$COLOR.VIOLET20
XLC$COLOR.TEAL21
XLC$COLOR.GREY_25_PERCENT22
XLC$COLOR.GREY_50_PERCENT23
XLC$COLOR.CORNFLOWER_BLUE24
XLC$COLOR.MAROON25
XLC$COLOR.LEMON_CHIFFON26
XLC$COLOR.ORCHID28
XLC$COLOR.CORAL29
XLC$COLOR.ROYAL_BLUE30
XLC$COLOR.LIGHT_CORNFLOWER_BLUE31
XLC$COLOR.SKY_BLUE40
XLC$COLOR.LIGHT_TURQUOISE41
XLC$COLOR.LIGHT_GREEN42
XLC$COLOR.LIGHT_YELLOW43
XLC$COLOR.PALE_BLUE44
XLC$COLOR.ROSE45
XLC$COLOR.LAVENDER46
XLC$COLOR.TAN47
XLC$COLOR.LIGHT_BLUE48
XLC$COLOR.AQUA49
XLC$COLOR.LIME50
XLC$COLOR.GOLD51
XLC$COLOR.LIGHT_ORANGE52
XLC$COLOR.ORANGE53
XLC$COLOR.BLUE_GREY54
XLC$COLOR.GREY_40_PERCENT55
XLC$COLOR.DARK_TEAL56
XLC$COLOR.SEA_GREEN57
XLC$COLOR.DARK_GREEN58
XLC$COLOR.OLIVE_GREEN59
XLC$COLOR.BROWN60
XLC$COLOR.PLUM61
XLC$COLOR.INDIGO62
XLC$COLOR.GREY_80_PERCENT63
XLC$COLOR.AUTOMATIC64
XLC$FILL.NO_FILL0
XLC$FILL.SOLID_FOREGROUND1
XLC$FILL.FINE_DOTS2
XLC$FILL.ALT_BARS3
XLC$FILL.SPARSE_DOTS4
XLC$FILL.THICK_HORZ_BANDS5
XLC$FILL.THICK_VERT_BANDS6
XLC$FILL.THICK_BACKWARD_DIAG7
XLC$FILL.THICK_FORWARD_DIAG8
XLC$FILL.BIG_SPOTS9
XLC$FILL.BRICKS10
XLC$FILL.THIN_HORZ_BANDS11
XLC$FILL.THIN_VERT_BANDS12
XLC$FILL.THIN_BACKWARD_DIAG13
XLC$FILL.THIN_FORWARD_DIAG14
XLC$FILL.SQUARES15
XLC$FILL.DIAMONDS16


少しでも、あなたのウェブや実験の解析が楽になりますように!!

タイトルとURLをコピーしました