データ分析がしたい

企業でデータ分析などやっています。主にRやPythonによるデータマイニング・機械学習関連の話題やその他備忘録について書いてます。

[R]DBから日本語データを読み込んだ際の文字コードの変更

Rにおいて、「DBI」と「RPostgreSQL」を使ってデータを読み込む方法を以前紹介しました。
 http://overlap.hatenablog.jp/entry/2013/05/16/224030

上記の方法は基本的に問題はないのですが、日本語データを読み込む時に文字化けするという問題があります。
(ファイルから読み込む場合は読み込み時に文字コードを指定ますが、DBIパッケージでDBからデータを取得する際に文字コードは指定できないと思われるので。)

この問題は、データをR上に読み込んだ後に文字コードを変更することで解決できます。
以下、具体的な方法について述べます。


ある文字列の文字コードはiconv関数で変換できます。
使い方は

 iconv(文字列,from="変換前の文字コード",to="変換後の文字コード")

となります。文字列はvector型で大丈夫です。またfromとtoで変換前のエンコーディングと変換後のエンコーディングを指定します。

実際に使った場合、例えば以下のようになります。

> library(DBI)
> library(RPostgreSQL)
> con <- dbConnect(PostgreSQL(),host="hostname",user="username",password="password",dbname="dbname")
> sql <- dbGetQuery(con,"SELECT prefecture FROM table_name")
> head(sql$prefecture)
[1] "譚ア莠ャ驛ス"    "譚ア莠ャ驛ス"    "譚ア莠ャ驛ス"    "諢帷衍逵\x8c" "譚ア莠ャ驛ス"    "蛹玲オキ驕\x93"
> head(iconv(sql$prefecture,from="utf-8",to="cp932"))
[1] "東京都" "東京都" "東京都" "愛知県" "東京都" "北海道"

指定できる文字コードは、iconvlist()で確認できます。

> iconvlist()
  [1] "437"                     "850"                     "852"                     "855"                    
  [5] "857"                     "860"                     "861"                     "862"                    
  [9] "863"                     "865"                     "866"                     "869"                    
 [13] "ANSI_X3.4-1968"          "ANSI_X3.4-1986"          "ASCII"                   "ASMO-708"               
 [17] "BIG-5"                   "BIG-FIVE"                "big5"                    "BIG5"                   
 [21] "big5-hkscs"              "BIG5-HKSCS"              "big5hkscs"               "BIG5HKSCS"              
 [25] "CP-GR"                   "CP-IS"                   "cp1025"                  "CP1125"                 
 [29] "CP1133"                  "CP1200"                  "CP12000"                 "CP12001"                
...

あるテーブルの特定列のエンコーディングを変換したい場合、以下のようにすることで任意の列のエンコーディングを変更することができます。

# sqlテーブルの12列目と14列目の文字コードを変換
> sql[12] <- data.frame(lapply(sql[12],iconv,from="utf-8",to="cp932"))
> sql[14] <- data.frame(lapply(sql[14],iconv,from="utf-8",to="cp932"))

これで分析スタートできますね。