Hatena::ブログ(Diary)

盆栽日記

2014-04-05

dplyrとPostgreSQLではまったポイント

dplyrをPostgreSQLから叩いてはまったポイントをつらつらと書きます。

カラム名(フィールド)を大文字で書かない

DB扱う人にとっては当然の話だとは思いますがカラム名は小文字でないとエラーが出る場合があります。

大文字使っている時はエスケープしておくこと。

%in%演算子はローカルに落としてから

dplyrからPostgreSQLを叩く時 filterで%in%演算子を使うと以下のようにescapeがどうたらこうたらと怒られます。

Error in UseMethod("escape") : 
  no applicable method for 'escape' applied to an object of class "c('tbl_df', 'tbl', 'data.frame')"

一旦collect()などでローカルに落としてから%in%を使うという回避方法をとっています。

collectでクラッシュしたらas.data.frameで切り抜ける

1000万行くらいのデータにdplyrで集計をかけた後collectしてローカルに落とそうとすると、Rがクラッシュしました。

collectの段階でクラッシュしているようです。

collectをas.data.frameに替えるとクラッシュしないので、とりあえずこれでしのいでいます。

困ったらとりあえずSys.setlocale("LC_CTYPE", "C")

localeがJapanese_Japan.932な環境でdplyrを使うと以下のようなエラーが出る場合があります。

Error in nchar(values) : invalid multibyte string 12

Sys.setlocale("LC_CTYPE", "C")として用が済んだら元に戻すなどしてとりあえずしのいでいます。

as.data.frameではnに-1を指定する

dplyrで集計をかけた結果をデータフレームに変換しようとした際、デフォルトでは100万行を超えていると先頭100万行のみがデータフレームに変換されるという仕様があります。

回避策としてはdata_overmillion %.% as.data.frame(n = -1)といった形で引数nに-1を指定します。

以下のas.data.frame.tbl_sql参照のこと。

https://github.com/hadley/dplyr/blob/master/R/tbl-sql.r