読者です 読者をやめる 読者になる 読者になる

まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

ODBCで取得したデータの文字化けを解決する

database tips

ODBCは良い。古事記には書かれていないかもしれないが、ホクソエムがそう言っている(意訳)。

qiita.com

最近になってR用のODBIインターフェイスである{odbc}パッケージがCRANに登録されたので、Rからも心置き無く使うことができるし、 今後ますます人気が出てくると思う。ただ、実際に使ってみるとnon-ASCII文字列では文字化けを起こす状態で残念な感じだった。

それをなんとかする方法。

# ユーザ名やパスワードはダミー
library(DBI)
# .connection_stringの内容を.odbc.iniに適宜書き込んでおくと省略できる
con <- dbConnect(odbc::odbc(), .connection_string = "Driver={MySQL ODBC 5.3 ANSI Driver};Uid=<ユーザ名>;Pwd=<パスワード>;Server=localhost;Port=3306;Database=<データベース>;CharSet=sjis;")
# この状態ではマルチバイト文字が文字化けしている
d <- con %>% dbReadTable("<テーブル>")
name type
1 ????????? place
2 ???? transportation
3 ??? place
4 ?????? place
d %<>% dplyr::mutate_if(is.character, stringi::stri_conv, 
    from = "sjis", to = "UTF-8")
name type
1 東京ディズニーシー place
2 横浜駅 transportation
3 兼六園 place
4 東京ソラマチ place

CharSetの値にsjisを指定し、R側の文字コード変換関数でUTF8にするという方法。{odbc}側で文字コード問題を解決してくれることを願うが、これで少なくとも日本語については文字化けに対処できる。

余談であるが、ODBCについて詳しく知りたい人は こちらの資料 “Database Best Practices”を見ると良い。これは先月行われたRStudio Conf2017での{odbc}パッケージの開発者であるJim Hesterのスライドである。また発表の様子が公開されているので動画と合わせて見ると良いかもしれない

Enjoy!

RMarkdownファイルの中でSQLを実行する際のtips ~knitr language engine

rmarkdown sql tips

公式ページに書いている内容なのだけど、覚え書き。

RMarkdownファイルでSQLを実行させるという状況があったとき、{DBI}{odbc} といった各種のデータベース接続用パッケージや{dplyr}の接続関数を利用してデータを呼び出しても良いけど、実はチャンクコード内でSQL直書きできるという話。

過去に

uribo.hatenablog.com

を書いたが、こっちの方がより簡単。

まずはデータベースへの接続を行う。

```{r}
library(DBI)
con <- dbConnect(odbc::odbc(), "MySQL")
```

データベースへ接続された状態がconオブジェクトに保存された。このコネクションを利用して、RMarkdown内で生SQLを実行させていく。肝心なのはチャンク内でエンジンをデフォルトのrではなくてsqlにしておくこと。そしてチャンクオプションのconnectionにconオブジェクトを指定することの2点。

```{sql, connection = con, max.print = 10}
SELECT * FROM mtcars
```

出力件数はSQLのLIMITを使っても良いし、チャンクオプションのmax.printで制御しても良い。

```{sql, connection = con, output.var="sql.mtcars"}
SELECT * FROM mtcars
```

のようにoutput.varオプションを使うとSQLで取得したデータをRオブジェクトとして扱えるようになるので便利。一方でRオブジェクトの値をSQLチャンクに渡すことも可能で、その際は以下のようなコードを書く。手順としては、Rオブジェクトを作り、SQLチャンク内でSQLに引き渡すRオブジェクト名の前に?をつけるだけ。

```{r}
limits <- 7
```
```{sql, connection = con}
SELECT * FROM mtcars LIMIT ?limits
```

コネクションを固定する

都度SQLチャンクにconnectionを指定するのも手間なので、接続状態を維持しておきたいという時にはknitr::opts_chunk()の値にコネクションを残しておけば良い。こうしておくことでSQLチャンクでは常にconnectionで参照しているRオブジェクトを対象とするようになるのでconnectionを書く必要がなくなる。

```{r}
library(DBI)
con <- dbConnect(odbc::odbc(), "MySQL")
knitr::opts_chunk$set(connection = "con")
```

ちなみにknitrの言語エンジンでは、SQL以外にも複数の言語が実行できる環境が整っている。

チャンクで言語を指定するのとengineによる指定による違いがわかっていないのだが。ここにあるものの一部はチャンクで使えるみたい

Language engines - Yihui Xie | 谢益辉

Enjoy!

2017年のRとの付き合い方: 分析環境編

R

ギョームでRを使い始めてから一年経っていないのだけど、それなりにスタイルが確立してきた気がするし、新年なので、現状で理想的だと思われる分析環境を整理しておく。ちなみに私のギョームは主にデータの前処理や地理空間データのマッピング、簡易アプリケーションの作成で、巷のデータサイエンティスト的なものとは違う。いわゆるにわかデータサエンティストである。とはいえ、ここであげる分析環境の整備や実行はデータサイエンティストや研究者のギョームにも有効だと思っている。

分析環境編とコーディングスタイル編について分けて書く。最初はまだ不確定なところもあり、今年から本格的に取り組もうというものもあるが分析環境についてまとめておく。これらの具体的な利用方法については、まだ未確定なものもあるが、このブログで後々書いていければと思う。

続きを読む