第23章 Rのエンコーディング問題

Rに限らず文字化けはPCにおいてしばしば起こる問題です。 平たく言ってしまうと、PCでは文字にコードが付与されており、機械がコードを読み取って文字を表示します。 そのコードと文字の対応関係をエンコーディングと呼び、異なるエンコーディングでデータを読み込むと文字化けが起こります。

23.1 なぜ文字化けが起こるのか

23.1.1 エンコーディング

実用上、日本語で文字化けが起こる問題の大半は

  • WindowsではShift-JISあるいはCP932で、
  • LinuxやMacなどのUNIX系ではUTF-8

エンコーディングしていることに起因しています。

UTF-8Uunicodeであることからも分かるように、世界で共通の規格として作られているエンコーディング方式になります。 なので、RおよびRStudioでは日本語独自のShift-JISではなくUTF-8を使うようにしたほうがよいでしょう。

23.1.2 RとRStudioにおける問題

RとRStudioで文字化けが起こる問題は大きく2つに分けられます。

  1. RStudioで日本語を含むRスクリプトを開いたとき
  2. Rで日本語を含むデータを読み込んだとき

以下では、それぞれの問題の対処法を紹介します。

23.2 Rスクリプトの文字化け

Rスクリプトが文字化けしている場合はRStudiで対処します。 例としてUTF-8でエンコードしたRスクリプトShift-JISでエンコードしたRスクリプトをRStudioで開いてみてください。 (設定を変更していなければ)Windowsの場合は前者が、Linux/Macの人は後者が文字化けしているはずです。

23.2.1 ファイルを開く

まず、デフォルトをUTF-8に変更しましょう。 メニューの中のFileReopen with Encoding...というのがあるので、UTF-8を選択します。 さらにSet as default encoding for source filesにチェックを入れることで今後はUTF-8で表示されます。

UTF-8でエンコードされた方は正常に表示され、Shift-JISでエンコードされた方は文字化けしていることを確認してください。 今後、RStudioで文字化けが起こる場合はデフォルトがUTF-8になっているので、Rスクリプトが他のエンコードのために起こっていることになります。

そのような場合にはReopen with Encoding...で適当なエンコーディングを選択します。 例えば、Shift-JISを選択すると正しく表示されるはずです。

23.2.2 ファイルを保存する

自分で作成したRスクリプトを保存する際にはメニューのFileの中のSave with Encoding...UTF-8を選択してください。 ここでもUTF-8がデフォルトになるようにチェックを入れておきましょう。

23.3 データの文字化け

データが文字化けしているときはRで対処します。 UTF-8でエンコーディングしたデータShift-JISでエンコーディングしたデータをそれぞれ読み込んでみてください。 やはりWindowsでは前者が、Linux/Macでは後者が文字化けをしているはずです。

read.csv("data/data_utf8.csv")
read.csv("data/data_sjis.csv")
## Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec, : invalid multibyte string at '<83>C<83>k'
  • 僕はLinuxを使っているので後者が文字化けを起こしてエラーが出ています。

23.3.1 標準関数の場合

標準関数の場合、fileEncodingというオプションでエンコーディングを指定します。

read.csv("data/data_utf8.csv", fileEncoding = "utf8")
read.csv("data/data_sjis.csv", fileEncoding = "shift-jis")

23.3.2 tidyverseの場合

tidyversereadrの場合はlocaleで指定します。

  • readrtidyverseに含まれているので、tidyverseを読み込んだ場合は、別途読み込む必要はありません。
library(tidyverse)
read_csv("data/data_utf8.csv", locale = locale(encoding = "utf8"))
## Parsed with column specification:
## cols(
##   member = col_character()
## )
read_csv("data/data_sjis.csv", locale = locale(encoding = "shift-jis"))
## Parsed with column specification:
## cols(
##   member = col_character()
## )

23.3.3 エンコーディングを確認する方法

readrguess_encoding()という関数を使うと、どのようなエンコーディングがされているかを推測します。

guess_encoding("data/data_utf8.csv")
guess_encoding("data/data_sjis.csv")
  • windows-1215というのはCP1215とも呼ばれるエンコーディングで、Shift-JISの親戚のようなものです(きっと)。

23.3.4 もとのデータを見たい場合

しばしばRではなく直接データを見たいときがあります。 そのような場合は、LibreOfficeのCalcというソフトで開くとエンコーディングを指定することができます。

23.3.5 データを保存する場合

データを書き出す場合、UTF-8で行うのが望ましいですが、そうするとWindowsからExcelなどで開いた場合に文字化けしてしまいます。 それを回避するために、readrwrite_excel_csv()を使うとエクセルで開いても文字化けしません。

23.4 その他の問題

23.4.1 アカウント名が日本語の場合

Windowsでアカウント名が日本語の場合、パスを通すときにエラーが出てくる場合があります。 そのような場合は、

  1. 新しいアカウントを作成する。
  2. 新しいアカウントを作成し、現在のアカウントの内容を全てコピーして、現在のアカウントを削除する。
  3. OSをクリーンインストールする。
  4. Linux(Ubuntuなど)を使う。
    1. 仮想マシン(VMwareやVirtualBox)を使う。
    2. デュアルブートをする。

といった選択肢が考えられます(下に行くほど難易度が高い)。

23.4.2 画像で日本語が文字化けする場合

Macで画像を出力する際に日本語が文字化けすることがあります。 plot()の場合は、

par(family = "HiraKakuProN-W3")

ggplot2の場合は、

theme(base_family = "HiraKakuProN-W3")

とするらしいです(Macは使ったことがないので分かりません)。

  • quantedaでプロットする際、うまくフォントが指定できない場合があるので、こちらを参考に、extrafont::fonts()でフォント一覧を確認して、適当なものを指定して下さい。