裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

コメントをもらえるようにしておくと吉

2015年01月27日 | ブログラミング

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"

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村