[小ネタ]Rでデータフレームのカラム名の文字コードを変換する
Rのデータフレームのカラム名にShift-JISの文字列を含むデータがあり、CSVへの書き出し時にはまったので文字コードの変換を行いました
はじめに
前回の記事 でRDataファイルをCSVに変換するスニペットを書いて必要なデータをどんどん変換していたのですが、カラム名にShift-JISの文字列を含むデータがあり、CSVへの書き出し時にはまったので文字コードの変換を行いました。この記事ではその内容を紹介します。
元データの確認
対象のデータのカラム名は以下のようになっています。
names(data.log.core30)
出力
'\x82i\x82s''\x83Z\x83u\x83\x93''\x90M\x89z\x89\xbb''\x89ԉ\xa4''\x95\x90\x93c''\x83A\x83X\x83e\x83\x89\x83X''\x90V\x93\xfa\x93S\x8fZ\x8b\xe0''\x83R\x83}\x83c''\x93\xfa\x97\xa7''\x93\x8c\x8e\xc5''\x83p\x83i\x83\\\x83j\x83b\x83N''\x83\\\x83j\x81[''\x83t\x83@\x83i\x83b\x83N''\x93\xfa\x8eY\x8e\xa9''\x83g\x83\x88\x83^''\x83z\x83\x93\x83_''\x83L\x83\x84\x83m\x83\x93''\x8eO\x88䕨''\x8eO\x95H\x8f\xa4''\x8eO\x95H\x82t\x82e\x82i''\x8eO\x88\xe4\x8fZ\x97F\x82e\x82f''\x82݂\xb8\x82قe\x82f''\x96쑺''\x93\x8c\x8b\x9e\x8aC\x8f\xe3''\x95H\x92n\x8f\x8a''\x82i\x82q\x93\x8c\x93\xfa\x96{''\x82m\x82s\x82s''\x82m\x82s\x82s\x83h\x83R\x83\x82''\x83\\\x83t\x83g\x83o\x83\x93\x83N'
このまま書き出そうとすると以下のエラーが発生します。
write.csv(data.log.core30, "/data/workspace_files/TSA/data_log_core30.csv", row.names=TRUE)
Error in gsub("\"", qstring, col.names, fixed = TRUE): input string 2 is invalid in this locale Traceback: 1. write.csv(data.log.core30, "/data/workspace_files/TSA/data_log_core30.csv", . row.names = TRUE) 2. eval.parent(Call) 3. eval(expr, p) 4. eval(expr, p) 5. write.table(data.log.core30, "/data/workspace_files/TSA/data_log_core30.csv", . row.names = TRUE, col.names = NA, sep = ",", dec = ".", qmethod = "double") 6. paste0("\"", gsub("\"", qstring, col.names, fixed = TRUE), "\"") 7. gsub("\"", qstring, col.names, fixed = TRUE)
文字コードの変換
そこでiconvで文字コードを変換を行います。
iconv(names(data.log.core30), from = "shift-jis", to = "utf8")
カラム名がUTF8に変換されてコンソールにも表示されました。
'JT''セブン''信越化''花王''武田''アステラス''新日鉄住金''コマツ''日立''東芝''パナソニック''ソニー''ファナック''日産自''トヨタ''ホンダ''キヤノン''三井物''三菱商''三菱UFJ''三井住友FG''みずほFG''野村''東京海上''菱地所''JR東日本''NTT''NTTドコモ''ソフトバンク'
この結果を使って元データのカラム名を置き換えます。これでエラーを発生させずにデータをCSVで書き出すことができます。