Stata Tips: 全角英数字を半角に変換するための完全ガイド
データ分析における最初のステップはデータのクリーニングで、それはしばしば最も時間がかかり、しかし最も重要なステップとなります。
その中でも文字列変数の操作は、面倒なのであまり丁寧に行われないか、諦められるかの何れかです。
特に、外部(あまりデータ分析を行っていない)から提供を受けるデータでは、文字列変数に何故か全角英数字を半角英数字が混ざっています。おそらく全ての解析ソフトで全角と半角は異なる文字として扱われます。
このnoteでは、統計ソフトウェアStataを使用して、文字列変数に含まれる全角英数字を半角英数字に簡単に変換する方法を紹介します。
とりあえず、変換作業だけしたい場合は、「Stataコード」のコードをコピーして下さい。
変換の必要性について
全角英数字が混ざっていると、プログラムが認識できない場合や、文字列比較が思った通りに機能しない等、問題が発生します。例えば、"123"と"123"は人間にはほぼ同じに見えますが、コンピュータにとっては全く別の文字列です。
このような点から、データ分析を行う前に全角英数字を半角に統一することは重要です。これにより、予期しないエラーを防ぐことができます。
Stataコード
下記に全角英数字(数字、大文字アルファベット、小文字アルファベット)を半角英数字に修正するコードを示します。
このコードでは、変換の対象となる変数はvarnameです。複数有る場合は、foreachなどのループコマンドで繰り返し処理したり、この部分をprogramで定義したりしてしまえば良いと思います。
// 数字のリスト
local number_full "0 1 2 3 4 5 6 7 8 9"
local number_half "0 1 2 3 4 5 6 7 8 9"
// 大文字のアルファベットリスト
local upper_full "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
local upper_half "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
// 小文字のアルファベットリスト
local lower_full "a b c d e f g h i j k l m n o p q r s t u v w x y z"
local lower_half "a b c d e f g h i j k l m n o p q r s t u v w x y z"
// 数字についてループ
forvalues i = 1/10 {
local nf : word `i' of `number_full'
local nh : word `i' of `number_half'
replace varname = subinstr(varname,"`nf'","`nh'",.)
}
// アルファベットについてループについてループ
forvalues i = 1/26 {
// 大文字
local uf : word `i' of `upper_full'
local uh : word `i' of `upper_half'
replace varname = subinstr(varname,"`uf'","`uh'",.)
// 小文字
local lf : word `i' of `lower_full'
local lh : word `i' of `lower_half'
replace varname = subinstr(varname,"`lf'","`lh'",.)
}
Stataコードの説明
基本的に同じ操作を、数字・アルファベット大文字・アルファベット小文字についてforvaluesループをかけながら、行っています。コードの説明は数字に限って行いますが、他も同様のことと行っています。
localマクロの定義
このコードでは、localマクロを6つ定義しています。数字、アルファベット大文字、アルファベット小文字の3パターン、全角と半角の2パターンで合計6つになっています。
これらを下記の様にlocal, word ofを使って、ループ内で全角・半角のペアで呼び出しています。
このコードでは、localマクロ nf には全角数字のうち i番目の文字が格納され、localマクロ nh には半角数字のうち i番目の文字が格納されます。
つまり、同じ数字(全角/半角のみ異なる)が格納されています。
local nf : word `i' of `number_full'
local nh : word `i' of `number_half'
subinstr関数
全角文字を半角文字に置き換えるために、subinstr関数を使っています。このsubinstr関数は、下記の様に4つの引数を取る関数です。
s1からs3が文字列引数で、nが数値または欠損(ドット)をとる引数です。
subinstr(s1, s2, s3, n)
このsubinstr関数では、引数s1に含まれる最初のn個の引数s2を引数s3に置き換えます(nが欠損の時は、全てのs2をs3に置き換えます)。日本語で書くと分かり難いので、次の3つの例を見て下さい。
di subinstr("'this is a pen' is a simple sentense", "is", "IS", 1)
'thIS is a pen' is a simple sentense
最初の例では、引数s1に含まれている文字のうち、最初1つ目の"is"が"IS"に変換されています。これは4番目の引数であるnが1であるためです。
di subinstr("'this is a pen' is a simple sentense", "is", "IS", 2)
'thIS IS a pen' is a simple sentense
次の例では、引数s1に含まれている文字のうち、最初2つ目までの"is"が"IS"に変換されました。これはn=2であるためです。
. di subinstr("'this is a pen' is a simple sentense", "is", "IS", .)
'thIS IS a pen' IS a simple sentense
最後の例では、引数s1に含まれている文字のうち、全ての"is"が"IS"に変換されました。これはnを欠損値(ドット)にしているためです。
subinstr関数による全角/半角変換
では、この全角/半角変換では、どのような操作になっているか確認します。
下記の様に、引数s1に対象となる文字列変数を指定し、引数s2には全角文字を格納したマクロ、引数s3には半角文字を格納したマクロ、引数nには欠損(ドット)としています。
これにより、文字列変数に含まれる全ての全角文字が半角文字に変換されます。
replace varname = subinstr(varname,"`nf'","`nh'",.)
adoファイル
この処理を一括で行えるadoファイルを作成しています。自分用なので、コマンド名が微妙(textconv_f2h)ですが、必要に応じてご利用ください。また、変数に上書きしますので、ご注意ください。
下記の様にとてもシンプルな文法です。コマンド名のすぐ後に変数名をいれるのみです。
この簡易コマンドにより、varnameに入れた文字列変数にふくまれる全角英数字を半角英数字に変換します。
textconv_f2h varname
ダウンロードしたadoファイルを格納する箇所
adopathコマンドを実行して下さい。
ここで示されたフォルダに入れておけばOKです。Stataは上から順に優先しますが、個人的に作成したものであれば、(PERSONAL)でよいと思います。なお、3番目は、ワーキングディレクトリを意味しています。