Hatena::ブログ(Diary)

盆栽日記

2016-11-09

XLConnectにtblクラスのデータをつっこむとエラーになるから注意

XLConnectにdplyr等で操作した後のtblクラスのデータをつっこむとエラーが出る。

たとえば以下のようなコードを実行する。

smp <- loadWorkbook("sample.xlsx", create=TRUE)
smp["サンプル"] <- iris %>% group_by(Species) %>% tally()

こういうエラーが出る。

Error in doTryCatch(return(expr), name, parentenv, handler) :

Conversion to character for column Species failed! Check the class.

as.data.frameしてやれば解決する。

smp <- loadWorkbook("sample.xlsx", create=TRUE)
smp["サンプル"] <- iris %>% group_by(Species) %>% tally() %>% as.data.frame()

データフレームだと今までエラー出なかったのに!という時はだいたいこのtblが原因なので困ったらas.data.frameと覚えておくと良い。

2013-10-03

これだけ覚えろXLConnect

久々に使うと使い方とか忘れがちなので。

とりあえず以下のように書けば出力はできる。

library(XLConnect)
wb <- loadWorkbook("あやめのデータ.xls", create=TRUE)
wb["あやめ"] <- iris # 組み込みのirisデータ
wb["車"] <- mtcars # 組み込みのmtcarsデータ
saveWorkbook(wb)

2012-03-13

Rからエクセルを開いてデータフレームをいじる

みんな大好きエクセルのお話です。

XLConnectを使えばエクセルからRへの入出力が自由自在(一部制限あり)ということはご存じかとは思いますが、ついにデータフレームの修正までエクセルでできるようになりました(最新版0.1-9)。

まあ、edit関数を使えば表計算っぽい感じで開くことができたのですが、これがエクセルだったらなあと思っていた方は少なくないのではないでしょうか。

ということで以下のようにxlcEditを使えばその辺よしなにできるのでお試しあれ。

library(XLConnect)
myObj <- iris
xlcEdit(myObj)
iris

2011-12-03

Rで条件付き書式(R Advent Calendar 2011)

R Advent Calendar 2011 も3日目ということで私にも順番が回ってきた。

ということで更新。

RとエクセルをつなぐパッケージとしてXLConnectという便利なものがある。

以前Tokyo.Rで少し紹介したのだが、めんどいので書式指定の話については触れなかった。

http://www.slideshare.net/dichika/tokyor18

しかし、Rでピボットテーブルもできるぜええええええって話もあるのでエクセルの牙を一本一本抜いていく意味でも条件付き書式について紹介しておきたい。

おおまかな流れとしては、

  1. 条件に合致したデータの行列番号を抽出
  2. 指定したい書式を作る
  3. データを出力
  4. 抽出した行列番号でセルを指定し、書式を設定する

となる。

以下コード例。

library(XLConnect)

# 新規ブックを作り、車というシートを作る

wb <- loadWorkbook("条件付き書式.xls", create = TRUE)
createSheet(wb, name = "車")

# 条件に合致する行・列番号を抽出する

rowIndex <- which(mtcars$wt > 3.5) + 1 # wtが3.5より大きい行番号を抽出して1を足す(列名分だけ1行ずれるので)
colIndex <- which(names(mtcars) == "wt") # wtの列番号を抽出

# 指定したい書式をつくる

heavyCar <- createCellStyle(wb, name = "HeavyCar")
setFillPattern(heavyCar, fill = XLC$"FILL.SOLID_FOREGROUND")
setFillForegroundColor(heavyCar, color = XLC$"COLOR.RED")

# データを出力する

createName(wb, name = "出力範囲", formula = "車!$A$1")
writeNamedRegion(wb, mtcars, name = "出力範囲")

# 条件に合致するセルに書式を指定する

setCellStyle(wb, sheet = "車", row = rowIndex, col = colIndex,
            cellstyle = heavyCar)

# ブックを閉じる

saveWorkbook(wb)

ということでR始めて2年になりました

来年1月でR歴2年になります。R歴=プログラミング歴なのでプログラミング歴も2年になりますが、なんとか便利パッケージを使ったり不便利パッケージを作ったりできるくらいにはなりました。Tokyo.R始め、全国のRコミュニティの皆さんのおかげです。ただ、まだまだ技術不足でやりたいことも十分にやれていない状況なのでさらなる高みを目指してPythonをがんばろうと思います!さよならR!

2011-10-06

Rからエクセルに色々と書き込む

Rで分析した結果をエクセル方眼紙に叩きこまなければいけない状況、あると思います。

XLConnectパッケージを使うとその辺が簡単にできるのでぜひお試しあれ。

以下はデータと画像をそれぞれ別のシートに書きこむコード。

他にもセルの書式を指定したり、関数を書きこんだり色々できるのでみんな使うといい。

library(ggplot2)
library(XLConnect)

#書き込むための画像を準備

qplot(data=iris, x=Sepal.Length, y=Sepal.Width, geom="point")
ggsave(file="sample.png")

# ブックを開いてデータを書きこむシートを作る
# 新規の場合はcreate=TRUEを指定

wb <- loadWorkbook("sample.xls", create = TRUE)
createSheet(wb, name="sample")

# シートに書き込めるオブジェクトは原則としてデータフレーム
# テキストを書きこみたい時はデータフレームにして、header=FALSEを指定

writeWorksheet(object = wb, data = data.frame(x="これはサンプルです"), sheet = "sample", startRow = 2, startCol = 2, header=FALSE)
writeWorksheet(object = wb, data = iris, sheet = "sample", startRow = 4, startCol = 2)

# 新規シート(sampleImageという名前)を追加して画像を書きこむ
# 画像を書きこむ場合は、Nameregionを指定する必要がある

createSheet(wb, name="sampleImage")
createName(wb, name = "sampleImage", formula = "sampleImage!$B$2")
addImage(object = wb, filename = "sample.png", name = "sampleImage", originalSize=TRUE)

#ブックを閉じる

saveWorkbook(wb)