Web ページを見ていると,他人事ながら,一言お伝えしたいという気になることがある(そういうのを,余計なお節介というんだけど)。
「R で全角数字を半角数字に書き換える」において...
> 郵便局のサイトにある「事業所の個別郵便番号データダウンロード」を
> 配布されているのがzip形式なので、URLで直接読み込むのではなくPC上で解凍してから読み込みます。
> > zip <- read.csv("JADD1407.CSV", header=FALSE) # ダウンロードしたファイルの読み込み
Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) :
invalid multibyte string at...
> 読み込めない・・・
> 郵便局のサイトの説明によるとShift-JISらしいので、文字コードを指定してみる。「encoding="SHIFT-JIS"」を追加します。
> なぜかエラーで読み込めない・・・
> よく分からないので、テキストエディタでcsvをUTF-8に変換してから読み込むこととします。
追加すべき引数は,fileEncoding そして指定するのは SHIFT-JIS ではなく cp932
つまり,
zip <- read.csv("JADD1407.CSV", header=FALSE, fileEncoding="cp932")
> さてここから、冒頭のページに載ってたgsub()というコマンドで、全角数字を半角数字に置き換えてみます。
> しかしgsub()は、1種類の文字列を1種類の文字列に置き換えるものなので、「0~9」→「0~9」をまとめて指定することができないっぽい。なので、「0」→「0」から順番に繰り返していく関数を作ります。
> また、データフレームに対してgsub()による置換を実行すると謎な出力がでてきてむかついたので、列ごとにベクトルとして処理していくことにします。
> gsub.multi <- function (pattern, replacement, data) {
+ # patternには、置き換える対象となる文字列をベクトルで与える
+ # replacementには、上記のそれぞれを何で置き換えるかをベクトルで与える
+ # dataにはデータフレームを入れる
+
+ for (i in 1:ncol(data)) {
+ for (j in 1:length(pattern)) {
+ data[,i] <- gsub(pattern[j], replacement[j], data[,i])
+ }
+ }
+ return(data)
+ }
> zenkaku <- c("0","1","2","3","4","5","6","7","8","9")
> hankaku <- c("0","1","2","3","4","5","6","7","8","9")
>
> address2 <- gsub.multi(pattern=zenkaku, replacement=hankaku, data=address)
これでもよいけど,chartr という関数が便利。
> chartr("0123456789", "0123456789", "3450246813579")
[1] "3450246813579"