Exploratoryで数字のみを半角にする(約物類は全角のまま、数字だけを半角にする)

データラングリング

日本語の文章では、縦書きでも横書きでも、括弧類(【】『』「」()など)を始めとする約物は、全角で入力した方が楽です。

理由を厳密に検討すると結構大変(対象を日常的な文書とするのか、こうしたブログなのか、あるいは出版物なのか、等によっても異なる)なのですが、ここでは入力段階の実務的な観点に絞ってみます。

こうした状況でかっこを半角で入力すると、フォントによっては上記のように一部が下にはみ出してしまいます。これは、邦文文字と欧文文字で、ベースラインが異なるためです。

縦書きだともっとかっこ悪くなります。

もちろんこれはフォントによって異なりますし、邦文と欧文とでフォントを切り替えたり、回避策はあまたあり、プロの出版物であれば、編集者や印刷担当者がうまく処理してくれることでしょう。

しかし、入力の時から全角にしておいた方が見た目もきれいになり、仕上りと近くなる可能性が高いので、最初から全角に統一しておいた方が楽かと思います。

といいつつも、テクノロジー分野では、むしろ約物をなるべく半角にする文化もあるようです。

コピーライターが気になる半角カッコと全角カッコの話|よりみちコピーライター
つい、先日のこと。わたしはデザイナーからリーフレットの文字チェックつまり校正作業を頼まれたんです。 その際、次のような指摘を入れました。 (税込) → (税込) ※カッコを全角に 夜、パートナーと一緒にご飯を作りながらこのカッコのことを話し...

このあたりも「入力(データとしての持ち方)」と「表示(組版)」という概念の混同など、専門的に見ると色々突っ込みどころはあるのですが、それは別の機会にするとして、ここでは「入力段階ではどちらかに統一すべきである」、そして、「統一するとしたら全角に倒しておいた方が楽である」ということだけ強調しておきたいと思います。

参考情報として、日本翻訳協会がまとめた「JTF日本語標準スタイルガイド」(リンク先PDF注意)という、日本語の文章を入力するにあたってのルール集があります。ここでも、冒頭に掲げられた「12の基本ルール」の中で、下記のように定められています。

(ここでの話は参考文献や、欧文が主体の論文や学術書などは除いています)

というわけでデータ処理においても、元の表記が揺れているデータを、上のような方式に統一したいことがあります。下記のスクショで【例A】を【例B】でなく、【例C】のように変換したいのです。

かつてエディターソフトでは、「英数字は半角に、約物は全角に統一する」という機能が普通に搭載されていたものですが、いま確認してみると、むしろレアな機能になってしまっているのですね。

Exploratoryには、これができそうな機能として、「テキストデータの加工>変換する」の下に「文字の標準化」と「全角 / 半角」という二つのメニューが用意されています。

今、下記のようなデータがあったとして、

これらをすべて前掲の【例C】の形式、つまり2025年(令和7年)12月5日に統一したいとします。

「文字の標準化」を選ぶと、次のようなダイアログが表示されます。つまり、約物類もすべて半角に置き換えてしまいます。

「全角 / 半角」も(少なくとも丸括弧については)同じです。

ではどうするかですが、R標準(base)の関数chartr()関数を使うと、うまくいきました。

mutate(
  `年月日変換` = chartr("0-9A-Za-z()", "0-9A-Za-z()", 年月日)
)

このコード(全角の英数字を半角にする。ついでに半角の()があったら全角の()に変換する、というのも付け加えてみました)を、ExploratoryのカスタムRコマンドに入れて実行します。

すると、

無事、処理できました。

chartr()関数は、

chartr("{old文字列}", "{new文字列}","処理したい列(文字列ベクトル)")

とすると、処理したい列の中から、{old文字列}を探し、マッチする文字列があると、{new文字列}の同じ位置にある文字と入れ替えてくれる、という便利関数です。{old文字列}{new文字列}は基本、同じ長さにしてください。

つまり下記のように書くと、telephone_numberという列の中から、全角の「0」を発見したら赤い矢印をたどって「0」に変換し、全角の「1」を見つけたら「1」に変換し……といった作業をすべての要素について実行してくれます。

これだけだとありがたみがわかりにくいかもしれないのですが、実はこの文字列の指定に、範囲指定が使えるのです。そのため、{old文字列}に0123456789の代わりに0-9と書けます(-は半角のマイナスであることに注意)。

上のコードでは、「年月日」の列(文字列ベクトル)の中から0から9の範囲の文字を見つけたら、赤い矢印をたどって0-9に、全角Aから全角Zの範囲の文字を見つけたら黄色い矢印をたどってA-Zの同じ位置の文字に置換……(以下同)となります。

公式にも同じくchartr関数を使った案内がありますが、別途oldとnewの対照表を用意する方法を採用しています。用途次第ですが、単に数字等を変換したいだけなら、今回紹介した範囲を使った遣方の方がわかりやすいかもしれません。

EH #545 - 全角文字のうち、英数字のみを半角文字に置換したい
全角文字のうち、英数字のみを半角文字に置換する方法について紹介しています。

他方、対照表を使った方法は、今回実施した表記統一以外にも応用範囲が広そうです。

今回の情報につき、ソースは下記です。

chartr function - RDocumentation
Translate characters in character vectors, in particular from upper to lower case or vice versa.