RとPythonによるデータマイニング

企業でデータ分析などやっています。主に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"))

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