[小ネタ]Rでデータフレームのカラム名の文字コードを変換する

Rのデータフレームのカラム名にShift-JISの文字列を含むデータがあり、CSVへの書き出し時にはまったので文字コードの変換を行いました
2022.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回の記事 で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で書き出すことができます。