データファイルの入出力(特にCSVファイルとExcelファイル)について説明します。
外部ファイルの入力
外部ファイルの読み込み
分析に使うデータは、Microsoft Excel形式など、外部ファイルとして準備することが多いと思います。 ここでは、CSV(Comma-Separated Values:カンマ区切り値)ファイルとExcelファイルをRで読み込む方法を説明します。
サンプルファイルとして、saga.csvとsaga.xlsxの2つのファイルを用意したので、下のリンクからダウンロードしてください。 ダウンロードしたファイルは、ワーキングディレクトリの中に[data]というフォルダを作成し、その中に保存することにしましょう。
ダウンロードしたファイルを開いて、それぞれの中身を確認してみてください。
用意したファイルには、佐賀県内20市町の人口および世帯数のデータが記載されています。 きれいなスプレッドシート型のデータになっています。 このファイルをRにデータフレームとして読み込みます。
CSVファイル
Rには、read.csvというCSVファイルを読み込むための関数が用意されています。 しかし、ここでは、より柔軟性の高いreadrパッケージのread_csv関数を使います。
library (readr)
dat <- read_csv ("data/saga.csv" )
Rows: 20 Columns: 6
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): name
dbl (5): code, population, pop_male, pop_female, households
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# A tibble: 20 × 6
code name population pop_male pop_female households
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 412015 佐賀市 236372 111453 124919 93306
2 412023 唐津市 122785 57547 65238 43872
3 412031 鳥栖市 72902 34799 38103 27630
4 412040 多久市 19749 9146 10603 6847
5 412058 伊万里市 55238 26395 28843 19698
6 412066 武雄市 49062 23178 25884 16932
7 412074 鹿島市 29684 13920 15764 10124
8 412082 小城市 44259 20823 23436 14769
9 412091 嬉野市 27336 12667 14669 9214
10 412104 神埼市 31842 15172 16670 10913
11 413275 吉野ヶ里町 16411 8136 8275 5891
12 413411 基山町 17501 8266 9235 6321
13 413453 上峰町 9283 4379 4904 3260
14 413461 みやき町 25278 11969 13309 8638
15 413879 玄海町 5902 3035 2867 1918
16 414018 有田町 20148 9356 10792 6900
17 414239 大町町 6777 3077 3700 2560
18 414247 江北町 9583 4497 5086 3225
19 414255 白石町 23941 11133 12808 7253
20 414417 太良町 8779 4125 4654 2838
列ごとのデータ型を指定する
自治体コードのcode列が数字(dbl)になっています。 read_csv関数は、読み込んだデータからそれらのデータ型を推論します。 この場合は、自治体コードなので文字型として読み込んで欲しいのですが、そうなっていません。
これを防ぐには、以下の例のように、あらかじめ列ごとのデータ型を指定しておくことが有効です。 ここで、データ型(col_types)の”c”は文字(chracter)型を、“d”は数値(double:倍精度)型であることを意味します(詳しくはread_csv関数のヘルプ記事をご覧ください)。
dat <- read_csv ("data/saga.csv" , col_types = "ccdddd" )
dat
# A tibble: 20 × 6
code name population pop_male pop_female households
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 412015 佐賀市 236372 111453 124919 93306
2 412023 唐津市 122785 57547 65238 43872
3 412031 鳥栖市 72902 34799 38103 27630
4 412040 多久市 19749 9146 10603 6847
5 412058 伊万里市 55238 26395 28843 19698
6 412066 武雄市 49062 23178 25884 16932
7 412074 鹿島市 29684 13920 15764 10124
8 412082 小城市 44259 20823 23436 14769
9 412091 嬉野市 27336 12667 14669 9214
10 412104 神埼市 31842 15172 16670 10913
11 413275 吉野ヶ里町 16411 8136 8275 5891
12 413411 基山町 17501 8266 9235 6321
13 413453 上峰町 9283 4379 4904 3260
14 413461 みやき町 25278 11969 13309 8638
15 413879 玄海町 5902 3035 2867 1918
16 414018 有田町 20148 9356 10792 6900
17 414239 大町町 6777 3077 3700 2560
18 414247 江北町 9583 4497 5086 3225
19 414255 白石町 23941 11133 12808 7253
20 414417 太良町 8779 4125 4654 2838
Excelファイル
Excelファイルを読むには、readxlライブラリのread_excel関数が便利です。
library (readxl)
dat1 <- read_excel ("data/saga.xlsx" )
dat1
# A tibble: 20 × 6
code name population pop_male pop_female households
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 412015 佐賀市 236372 111453 124919 93306
2 412023 唐津市 122785 57547 65238 43872
3 412031 鳥栖市 72902 34799 38103 27630
4 412040 多久市 19749 9146 10603 6847
5 412058 伊万里市 55238 26395 28843 19698
6 412066 武雄市 49062 23178 25884 16932
7 412074 鹿島市 29684 13920 15764 10124
8 412082 小城市 44259 20823 23436 14769
9 412091 嬉野市 27336 12667 14669 9214
10 412104 神埼市 31842 15172 16670 10913
11 413275 吉野ヶ里町 16411 8136 8275 5891
12 413411 基山町 17501 8266 9235 6321
13 413453 上峰町 9283 4379 4904 3260
14 413461 みやき町 25278 11969 13309 8638
15 413879 玄海町 5902 3035 2867 1918
16 414018 有田町 20148 9356 10792 6900
17 414239 大町町 6777 3077 3700 2560
18 414247 江北町 9583 4497 5086 3225
19 414255 白石町 23941 11133 12808 7253
20 414417 太良町 8779 4125 4654 2838
Excelファイルの読み込み(実践編)
ここでは実践編として、佐賀県統計年鑑 において公開されているExcelファイルを読み込んでみましょう。 例として、「第4章 人口及び世帯」のファイルを使いますので、これをダウンロードして、ワーキングディレクトリのdataフォルダに移動してください。
このExcelファイルから、佐賀県内20市町の人口、世帯数、人口密度等からなるデータフレームを作成するには、以下のコードを実行します。
saga_pop <- read_excel (
path = "data/3_117718_up_alzqkodl.xlsx" , # ファイル名
sheet = "4-6" , # シート名
range = "A15:Q40" , # 読み込む範囲
col_names = c ("no" , "name" , "population" , "pop_male" , "pop_female" ,
"gender_ratio" , "households" , "area" , "density" ),
col_types = c ("numeric" , "text" , rep ("skip" , 8 ), rep ("numeric" , 7 ))
) |> tidyr:: drop_na ()
saga_pop
# A tibble: 20 × 9
no name population pop_male pop_female gender_ratio households area
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 佐賀市 233301 110191 123110 89.5 96874 432.
2 2 唐津市 117373 55015 62358 88.2 44192 488.
3 3 鳥栖市 74196 35528 38668 91.9 29816 71.7
4 4 多久市 18295 8555 9740 87.8 6773 97.0
5 5 伊万里市 52629 25445 27184 93.6 19984 255.
6 6 武雄市 47914 22727 25187 90.2 17624 195.
7 7 鹿島市 27892 13140 14752 89.1 10046 112.
8 8 小城市 43952 20772 23180 89.6 15907 95.8
9 9 嬉野市 25848 11995 13853 86.6 9157 126.
10 10 神埼市 31022 14884 16138 92.2 11452 125.
11 11 吉野ヶ里町 16323 7990 8333 95.9 6137 44.0
12 12 基山町 17250 8174 9076 90.1 6756 22.2
13 13 上峰町 9286 4455 4831 92.2 3598 12.8
14 14 みやき町 25511 12170 13341 91.2 9229 51.9
15 15 玄海町 5609 3067 2542 121. 2231 35.9
16 16 有田町 19010 8780 10230 85.8 6981 65.8
17 17 大町町 6293 2903 3390 85.6 2455 11.5
18 18 江北町 9566 4460 5106 87.3 3433 24.5
19 19 白石町 22051 10358 11693 88.6 7247 99.6
20 20 太良町 8121 3842 4279 89.8 2788 74.3
# ℹ 1 more variable: density <dbl>
以下、read_excel関数に与えた引数について説明します。
pathは読み込むファイルのパスを指定します。
sheetは読み込むシート名(もしくはシート番号)を指定します。
rangeは読み込むデータの範囲を指定します(多くの記法がありますが、“B15:Q40”のように書くのが最もわかりやすいと思います)。
col_namesは列名を指定します。c関数はベクトルを作成する関数で、ここでは8つの文字列からなるベクトルを作成しています。
col_typesはデータ型を指定しています。“text”は文字型を、“numeric”は数値型を意味します。“skip”を指定した列を読み込みをスキップします(つまり読み込まない)。rep関数は繰り返した結果をベクトルで出力する関数で、rep("numeric", 7)は、“numeric”を7回繰り返した結果(すなわち、c("numeric", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric")と同じ結果)になります。
最後に、tidyr::drop_na関数は、データフレームの中でNAを含む行を全て削除 する(落とす)関数です。 大元のExcel表には、市町だけでなく郡のデータが存在しています。 しかし第1列の”no”列には、市町のデータ行のみ通し番号が振られていて、郡の行にはありません(そのためread_excel関数で読み込むと、そのセルのデータがNAになります)。 このことを利用して、郡データの行を落とすことで、20市町だけのデータフレームにしています。
外部ファイルへの出力
CSVファイル
データフレームをCSVファイルとして書き出すには、Rに用意されているwrite.csvという関数を利用することもできます。 しかしここでは、より柔軟性の高いreadrパッケージのwrite_csv関数を使う方法を紹介します。
この例では、datというデータフレームを、saga2.csvというファイルに書き出しています。
write_csv (dat, "saga2.csv" )
Excelファイル
データフレームをExcelファイルとして書き出すには、writexlパッケージのwrite_xlsx関数が便利です。 この例では、datというデータフレームを、saga2.xlsxというファイルに書き出しています。
library (writexl)
write_xlsx (dat, "saga2.xlsx" )