- 不正なマルチバイト
- 型について
- 欠損値について
準備
今回は以下のような、購入データのサンプルを使用します。データはsample_purchase_data.csvという名前で保存されているものとします。日付 | 購入商品 | 購入者ID | 商品ID | 金額 | 購入回数 |
---|---|---|---|---|---|
20170601 | よもぎ饅頭 | 00220101 | aab | 130 | 1 |
20170601 | いちご大福 | 03440101 | aac | 210 | 1 |
20170601 | よもぎ饅頭 | 11020441 | aab | 130 | 2 |
20170601 | みたらしだんご | 13026761 | aaa | データなし | 1 |
1 2 3 |
install.packages("dplyr") library(dplyr) |
不正なマルチバイト
実行と問題
まずは何もオプションに指定せず、読み込んでみましょう。
1 2 3 4 5 6 7 |
#データの読み込み sample_data <- read.csv("sample_purchase_data.csv") #以下のエラーが出てしまう make.names(col.names, unique = TRUE) でエラー: '<93> |
解決方法
Rでは文字コードがOSのデフォルトになるため、Windowsで作成されたSJISのファイルはmacOSで文字コードを指定しないと読み込むことができません。どの文字コードで読み込みたいのか(ファイル自体の文字コード)を指定をすることで解決できます。 read.csv関数では、読み込み時の文字コードは、fileEncodingパラメーターで指定します。
1 2 3 4 5 6 |
#fileEncoding の後に文字コードを指定 sample_data1 <- read.csv( "sample_purchase_data.csv", fileEncoding = "SJIS" ) |
型について
実行と問題
まずは、先ほど読み込んだデータの中身を見てみましょう。 購入者IDの先頭にあった0が消えています。それでは、データの各列の型を確認してみましょう。
1 2 3 |
#中のデータの構成と型を確認 str(sample_data) |
日付 | 購入商品 | 購入者ID | 商品ID | 金額 | 購入回数 |
---|---|---|---|---|---|
20170601 | よもぎ饅頭 | 220101 | aab | 130 | 1 |
20170601 | いちご大福 | 3440101 | aac | 210 | 1 |
20170601 | よもぎ饅頭 | 11020441 | aab | 130 | 2 |
20170601 | みたらしだんご | 13026761 | aaa | データなし | 1 |
解決方法
読み込み時に各カラムの型を指定してあげましょう。ここではあえて、購入者ID以外の列はデフォルトと同じ形式を指定しています。 read.csv関数では、各カラムの型は、fileEncodingパラメーターで指定します。
1 2 3 4 5 6 7 |
#colClassesに、各々のカラムの型を指定しておくと、指定通りの型で読み込まれる sample_data2 <- read.csv( "sample_purchase_data.csv", fileEncoding = "SJIS", colClasses = c("integer", "factor", "character", "factor", "factor", "integer") ) |
欠損値について
実行と問題
金額列を計算したいので、文字が入っている行を削除し、数値に変換したいと思います。まずは、先ほど型指定をして読み込んだデータの構成と型を確認します。
1 2 3 4 5 |
#文字列が入っている行を除いて、intに変換しようとすると、うまく変換できない sample_data3 <- sample_data2 %>% filter(金額 != "データなし") %>% #金額が入っている行のみを選択 mutate(金額 = as.integer(金額)) #数値に変換 |
日付 | 購入商品 | 購入者ID | 商品ID | 金額 | 購入回数 |
---|---|---|---|---|---|
20170601 | よもぎ饅頭 | 00220101 | aab | 1 | 1 |
20170601 | いちご大福 | 03440101 | aac | 2 | 1 |
20170601 | よもぎ饅頭 | 11020441 | aab | 1 | 2 |
20170601 | みたらしだんご | 13026761 | aaa | データなし | 1 |
解決方法
欠損値に「データなし」という文字列が含まれているため、Rは金額カラムを文字列として認識しています。これを欠損値として認識させる必要があります。 read.csv関数では、欠損値を表現するのには、na.stringsパラメーターを指定します。
1 2 3 4 5 6 7 8 |
#na.stringsを指定して欠損値データをNAにする sample_data3 <- read.csv( "sample_purchase_data.csv", fileEncoding = "SJIS", colClasses = c("integer", "factor", "character", "factor", "integer", "integer"), na.strings = "データなし" ) |
日付 | 購入商品 | 購入者ID | 商品ID | 金額 | 購入回数 |
---|---|---|---|---|---|
20170601 | よもぎ饅頭 | 00220101 | aab | 130 | 1 |
20170601 | いちご大福 | 03440101 | aac | 210 | 1 |
20170601 | よもぎ饅頭 | 11020441 | aab | 130 | 2 |
20170601 | みたらしだんご | 13026761 | aaa | NA | 1 |