近年は誰でも安価にデータ分析ができるツールを手にする時代となりましたが、実務に使ってみようと思っても教科書通りにいかない、、ということはよくある現象かと思います。
リテラシーが高い人にとっては呼吸をするように無意識的に対応できるところが、私のような初心者にとっては躓きとなります。
今回は、AdWordsのレポートをCSVファイルで取得した時に文字化けで困ったので、その対応方法についてまとめてみました。
先ずは普通に読み込んでみた
コード
hogehoge <- read.csv("hogehoge.csv") head(hogehoge)
結果
Error in make.names(col.names, unique = TRUE) : invalid multibyte string at '<ff><fe><83>^JT<ec>0ン0<fc>0ネ0' In addition: Warning messages: 1: In read.table(file = file, header = header, sep = sep, quote = quote, : line 1 appears to contain embedded nulls
エラーです
文字コードを確認する
Rではデフォルトの文字コード以外の文字コードのファイルを読み込む際には文字コードを指定して読み込む必要があります。
文字コードの確認には、nkfが便利です。 使い方やインストールはここでは詳解しませんので各自ご準備下さい。
コマンドプロンプトでファイルのある箇所まで行き、nkfで確認
結果
文字コードを指定して読込
read.tableでもread.csvでも文字コードを指定して読込ができます。「fileEncoding = "UTF-16"」を追加します。
コード
hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16") head(hogehoge)
結果
広告レポート..2016.06.15.2016.07.14. 1 日\t広告の状態\t広告\t広告文 1\t広告文 2\t表示URL\tリンク先URL\t最終ページ URL\tモバイルの最終ページ URL\tトラッキング テンプレート\tカスタム パラメータ\tHeadline 1\tHeadline 2\t説明\tPath 1\tPath 2\tキャンペーン\t広告グループ\tステータス\tラベル\tキャンペーン タイプ\tキャンペーンのサブタイプ\tクリック数\t表示回数\tクリック率\t平均クリック単価\t費用\t平均掲載順位
文字化は解消されましたが、なんか変なデータになってしまいました。
先ずは、どうやら一行目にデータ以外の余分な行が入っているようです。人は何故データ以外の情報をCSVファイルに書いてしまうのでしょうか!!
冒頭のn行をスキップして読込
冒頭の何行かに余分な情報を入れていることはよくある話なので、スキップして読み込むという便利なオプション「skip=(行数)」があります。
コード
hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1) head(hogehoge)
結果*1
日.広告の状態.広告.広告文.1.広告文.2.表示URL.リンク先URL.最終ページ.URL.モバイルの最終ページ.URL.トラッキング.テンプレート.カスタム.パラメータ.Headline.1.Headline.2.説明.Path.1.Path.2.キャンペーン.広告グループ.ステータス.ラベル.キャンペーン.タイプ.キャンペーンのサブタイプ.クリック数.表示回数.クリック率.平均クリック単価.費用.平均掲載順位 ... 1 2016-07-13\tアクティブ\t広告名: 320x100_hogehoge.png; 320 x 100\t\t\t\t\t\t\t\t\t\t\t\t承認済み\t --\tディスプレイ ネットワークのみ\tすべての機能
まだなんだかよくわからない長い行として認識されています。
区切り文字を指定して読込
よく見ると「\t」という文字があります。正規表現でよく見る「タブ」のことだと推測されます。 CSVってカンマ区切りって意味じゃなかったっけ?と思いながら 区切り文字をタブに指定して 読込ます。
コード
hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t") head(hogehoge)
結果の前の方*2
日 広告の状態 広告 広告文.1 広告文.2 表示URL 1 2016-07-13 アクティブ 広告名: 320x100_hogehoge.png; 320 x 100 URL 2 2016-07-06 アクティブ 広告名: 468x60_hogehogec.png; 468 x 60 URL
後ろのほう*3
キャンペーン.タイプ キャンペーンのサブタイプ クリック数 表示回数 クリック率 1 ディスプレイ ネットワークのみ すべての機能 10 10000 __% 2 ディスプレイ ネットワークのみ すべての機能 300 100000 __%
どうやら1行目がヘッダー情報で、2行目からがデータのようです。
ヘッダーを指定する
既にread.csvが勝手にヘッダーを認識してくれているようですが、通常はヘッダーがあるよと指定して読込ます。
コード
hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t",header=T)
空白を空白として認識させておく
データを一部消したので公開した部分にはありませんが、何も書いていない列があったりします。そういう所は、欠損していると認識させておくほうが後で便利な場合があります。
コード
hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t",header=T,na.strings =c("","NULL")) heead(hogehoge)
結果の前の方*4
日 広告の状態 広告 広告文.1 広告文.2 表示URL リンク先URL 1 2016-07-13 アクティブ 広告名: 320x100_hogehoge.png; 320 x 100 <NA> <NA> URL <NA> 2 2016-07-06 アクティブ 広告名: 468x60_hogehoge.png; 468 x 60 <NA> <NA> URL <NA>
もっとちゃんとした情報は
その他にも、文字列が「factro」として認識されて「character」と認識されずに困ることがあります。
自分も苦労した経験があります。もっと早く知っておけばよかったと思います。
今回は必要としなかったその他の読み込み時のトラップはまだまだあります。読み込み時のオプションの指定方法についてはこちらのサイトがよくまとまっていました。