1 Excelファイルの読み込み

1.1 一つのExcelファイルを読み込む

  • dataフォルダに入っている「データ.xlsx」を開く
  • デフォルトでは一番最初のシートのデータが読みこまれる
library(readxl)

df_a <- 
  read_excel("data/データ.xlsx")

df_a
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <dbl> <dbl>
## 1 高海       2   157
## 2 桜内       2   160
## 3 松浦       3   162
## 4 黒澤       3   162
## 5 渡辺       2   157
## 6 津島       1   156
## 7 国木田     1   152
## 8 小原       3   163
## 9 黒澤       1   154

1.2 シートを指定して読みこむ

1.2.1 シート名の確認

readxl::excel_sheets

excel_sheets("data/データ.xlsx")
## [1] "Aqours" "μ's"

1.2.2 読み込み

df_m <- 
  read_excel("data/データ.xlsx", sheet = "μ's" )

df_m
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <dbl> <dbl>
## 1 高坂       2   157
## 2 絢瀬       3   162
## 3 南         2   159
## 4 園田       2   159
## 5 星空       1   155
## 6 西木野     1   161
## 7 東條       3   159
## 8 小泉       1   156
## 9 矢澤       3   154

1.3 すべてのシートから読みこんで1つのデータセットにまとめる

1.3.1 すべてのシートから読み込み

library(tidyverse)
library(janitor)   # clean_names()を使うため


path_name <- "data/データ.xlsx" # データのパスを格納

# シート名を取得しそれぞれから読み込んでリストにまとめる
df_all <-
  excel_sheets(path_name) %>%               # すべてのシートから読む方法(helpより)      
  set_names() %>%                           # 名前付きベクトルにする、↓で作成されるリストの要素名にもなる
  map(read_excel, path =  path_name) %>%
  map(clean_names, case = "old_janitor")    # エラーになる文字を自動で整形。日本語の場合,case = "old_janitor"を引数に入れた方がいい場合も

# 読みこんだデータ全体の構造を表示
str(df_all)
## List of 2
##  $ Aqours: tibble [9 x 3] (S3: tbl_df/tbl/data.frame)
##   ..$ 名前: chr [1:9] "高海" "桜内" "松浦" "黒澤" ...
##   ..$ 学年: num [1:9] 2 2 3 3 2 1 1 3 1
##   ..$ 身長: num [1:9] 157 160 162 162 157 156 152 163 154
##  $ μ's  : tibble [9 x 3] (S3: tbl_df/tbl/data.frame)
##   ..$ 名前: chr [1:9] "高坂" "絢瀬" "南" "園田" ...
##   ..$ 学年: num [1:9] 2 3 2 2 1 1 3 1 3
##   ..$ 身長: num [1:9] 157 162 159 159 155 161 159 156 154

1.3.2 個別でExcelファイルに保存する

  • リストの要素名をファイル名にする
library(writexl)

imap(df_all, ~write_xlsx(.x, path = str_c("result/",.y , ".xlsx")))

1.3.3 一つのデータフレームにする

  • 引数.id =で、リストの要素名を変数の値として入れられる
bind_rows(df_all, .id = "group")
## # A tibble: 18 x 4
##    group  名前    学年  身長
##    <chr>  <chr>  <dbl> <dbl>
##  1 Aqours 高海       2   157
##  2 Aqours 桜内       2   160
##  3 Aqours 松浦       3   162
##  4 Aqours 黒澤       3   162
##  5 Aqours 渡辺       2   157
##  6 Aqours 津島       1   156
##  7 Aqours 国木田     1   152
##  8 Aqours 小原       3   163
##  9 Aqours 黒澤       1   154
## 10 μ's    高坂       2   157
## 11 μ's    絢瀬       3   162
## 12 μ's    南         2   159
## 13 μ's    園田       2   159
## 14 μ's    星空       1   155
## 15 μ's    西木野     1   161
## 16 μ's    東條       3   159
## 17 μ's    小泉       1   156
## 18 μ's    矢澤       3   154

1.3.3.1 Excelファイルに保存する

1.4 複数のExcelファイルを読み込む

1.4.1 読み込むファイル名の一覧のオブジェクト作成

  files <-
    list.files(path = "result/", full.names = TRUE) # resultフォルダから

1.4.2 ファイルを一括で読み込む

ldata <-
    map(files, ~read_xlsx(.))

1.4.3 ファイル名抽出

file_name <- 
  str_replace(files, ".xlsx", "") %>% 
  str_replace("result/", "")

1.4.4 リストの要素名にファイル名を付与

ldata <-
    set_names(ldata, file_name)

1.4.5 リストの各要素を1つのデータフレームに統合

bind_rows(ldata, .id = "group")
## # A tibble: 18 x 4
##    group  名前    学年  身長
##    <chr>  <chr>  <dbl> <dbl>
##  1 Aqours 高海       2   157
##  2 Aqours 桜内       2   160
##  3 Aqours 松浦       3   162
##  4 Aqours 黒澤       3   162
##  5 Aqours 渡辺       2   157
##  6 Aqours 津島       1   156
##  7 Aqours 国木田     1   152
##  8 Aqours 小原       3   163
##  9 Aqours 黒澤       1   154
## 10 μ's    高坂       2   157
## 11 μ's    絢瀬       3   162
## 12 μ's    南         2   159
## 13 μ's    園田       2   159
## 14 μ's    星空       1   155
## 15 μ's    西木野     1   161
## 16 μ's    東條       3   159
## 17 μ's    小泉       1   156
## 18 μ's    矢澤       3   154

2 csvファイルの読み込み

  • 文字化け注意!
  • WindowsおよびExcelで作成したファイルは多くの場合SHIT-JISで作られていることが多い
  • 以下のコード実行の前提として,Rstudioの設定を変更しておく
    • Tools > Global Options > Code > Saving > Default text encodingsをUTF-8に

2.1 read_csv()

2.1.1 utf-8でエンコードされたcsvファイル

  • readr::read_csv()は,utf-8でエンコードされたファイルが前提
  • WindowsでExcel等で作った場合はこれじゃないことが多いはず
library(readr)
read_csv("data/データ(UTF-8).csv")
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <dbl> <dbl>
## 1 高海       2   157
## 2 桜内       2   160
## 3 松浦       3   162
## 4 黒澤       3   162
## 5 渡辺       2   157
## 6 津島       1   156
## 7 国木田     1   152
## 8 小原       3   163
## 9 黒澤       1   154

2.1.2 【文字化けの例】SHIT-JISでエンコードされたcsvファイル

  • 正確にはSHIT-JISの拡張版であるcp932
  • 変数名も文字化けして読めなくなるので、clean_names()で読める形式に変換している
read_csv("data/データ(SHIT-JIS).csv") %>% 
  clean_names(case = "old_janitor")
## # A tibble: 9 x 3
##   x_u_0096_u_00bc_u_0091_o x_u_008a_w_u_0094_n x_u_0090_g_u_0092_u_00b7
##   <chr>                                  <dbl>                    <dbl>
## 1 "\x8d\x82\x8aC"                            2                      157
## 2 "\x8d\xf7\x93\xe0"                         2                      160
## 3 "\x8f\xbc\x89Y"                            3                      162
## 4 "\x8d\x95\xe0V"                            3                      162
## 5 "\x93n\x95\xd3"                            2                      157
## 6 "\x92\xc3\x93\x87"                         1                      156
## 7 "\x8d\x91\x96\xd8\x93c"                    1                      152
## 8 "\x8f\xac\x8c\xb4"                         3                      163
## 9 "\x8d\x95\xe0V"                            1                      154

2.1.3 SHIT-JISでエンコードされたcsvファイル

  • これを読むためには,引数でSHIT-JISのファイルであることを指定する必要がある
    • 正確にはSHIT-JISの拡張版であるcp932
read_csv("data/データ(SHIT-JIS).csv", locale = locale(encoding = "cp932") )
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <dbl> <dbl>
## 1 高海       2   157
## 2 桜内       2   160
## 3 松浦       3   162
## 4 黒澤       3   162
## 5 渡辺       2   157
## 6 津島       1   156
## 7 国木田     1   152
## 8 小原       3   163
## 9 黒澤       1   154

2.2 read.csv

  • 従来のcsvを読む関数read.csv()を使えば,デフォルトでSHIT-JISのファイルは読める
read.csv("data/データ(SHIT-JIS).csv")
##     名前 学年 身長
## 1   高海    2  157
## 2   桜内    2  160
## 3   松浦    3  162
## 4   黒澤    3  162
## 5   渡辺    2  157
## 6   津島    1  156
## 7 国木田    1  152
## 8   小原    3  163
## 9   黒澤    1  154
  • UTF-8を読む場合
read.csv("data/データ(UTF-8).csv", encoding = "UTF-8")
##   X.U.FEFF.名前 学年 身長
## 1          高海    2  157
## 2          桜内    2  160
## 3          松浦    3  162
## 4          黒澤    3  162
## 5          渡辺    2  157
## 6          津島    1  156
## 7        国木田    1  152
## 8          小原    3  163
## 9          黒澤    1  154

2.3 data.table::fread()

  • 大容量のcsvを読む関数fread()を使えば,デフォルトでSHIT-JISのファイルは読める
library(data.table)
fread("data/データ(SHIT-JIS).csv") %>% 
  as_tibble() # tibble形式に変換
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <int> <int>
## 1 高海       2   157
## 2 桜内       2   160
## 3 松浦       3   162
## 4 黒澤       3   162
## 5 渡辺       2   157
## 6 津島       1   156
## 7 国木田     1   152
## 8 小原       3   163
## 9 黒澤       1   154
  • UTF-8を読む場合
fread("data/データ(UTF-8).csv", encoding = "UTF-8") %>% 
  as_tibble()
## # A tibble: 9 x 3
##   名前    学年  身長
##   <chr>  <int> <int>
## 1 高海       2   157
## 2 桜内       2   160
## 3 松浦       3   162
## 4 黒澤       3   162
## 5 渡辺       2   157
## 6 津島       1   156
## 7 国木田     1   152
## 8 小原       3   163
## 9 黒澤       1   154

3 その他

3.1 複数シートにデータが入ったExcelファイルを作成(データ作成用のためここでは実行しない)

  • データフレーム内の特定の変数で分割したデータフレームのリストを作成
iris_list <- 
  split(iris, iris$Species)

write_xlsx(iris_list, "data/iris.xlsx")

rm(iris_list) # いったん削除