3 Excelファイルの保存

3.1 一つのExcelファイルを保存する

writexlパッケージのwrite_xlsx()関数で、直接Excelファイルとして出力ができます。ここでは、新しく作成したデータフレームをExcelファイルとして保存してみます。

3.1.1 カテゴリ別平均値の作成

クチバシの長さと大きさを表す変数である、bill_length_mmbill_depth_mmについて、平均値と欠損を抜いたn(ペンギン数)を種類別に計算します。group_by()でカテゴリ別にしたい変数を指定し、summarise()で平均値とnを計算するコードが以下になります。

df_group_mean <- 
  df |> 
  group_by(種類) |> 
  summarise(across(
                   c(bill_length_mm, bill_depth_mm), # ここに変数
                   list(m = ~mean(., na.rm = TRUE),  # 平均値計算
                        n = ~sum(!is.na(.))))        # 欠損のない人数計算
           )

# ここは結果の整形部分
df_group_mean <- 
  df_group_mean |>  
  select(-bill_depth_mm_n) |>  # nが同じなので列削除
  rename(n = bill_length_mm_n)  # 列名をnにリネーム


knitr::kable(df_group_mean) # きれいな出力にするコード
種類 bill_length_mm_m n bill_depth_mm_m
アデリー 38.79139 151 18.34636
ジェンツー 47.50488 123 14.98211
ヒゲ 48.83382 68 18.42059

なお、ここでknitr::kable()という書き方が出てきますが、これはknitrパッケージのkable()関数という意味です。関数を1回しか使わない場合などにlibrary()で呼び出すのは無駄が多かったりするので、時々こういった記述が出てきます。

3.1.2 Excelファイルの保存

前節で作成したカテゴリ別平均値のデータフレームdf_group_meanをExcelファイルとして保存します。保存はwrite_xlsx()関数の中に、データフレームのオブジェクトと出力先のパスと保存ファイル名を入れるだけです。

write_xlsx(df_group_mean, "out/種類別平均値.xlsx")

out/の部分が出力先のフォルダを示しています。

3.1.2.1 【応用】ファイル名に自動で本日の日付を入れる

これはちょっと応用技ですが、便利なので紹介しておきます。lubridateパッケージのtoday()関数で、今日の日付を表示できるので、それを保存名を入れる時に組み込む(文字列なので区切ってstr_c()でくっつける)と、日付入りファイル名が作成できます。

write_xlsx(df_group_mean, 
         str_c("out/df_group_mean", "_", lubridate::today(), ".xlsx"))

3.2 複数のファイルを一度に保存する

これが活躍する場面としては、たとえばカテゴリ別(例:ペンギンの種類別、会社の部署別など)に集計した要約値をそのカテゴリ別に個々のExcelファイルにするといった状況が思いつきますので、それをやってみます。

3.2.1 データフレームをカテゴリ別に分割してリストにする

split()関数を使うことで、カテゴリ別にデータフレームを分割し、リストにまとめた結果を作成できます。データは3.1.1で作成したdf_group_meanを使います。

分割に使う変数は、df_group_mean$speciesのように、データフレーム名の後に$をつけてその後に指定します。この変数の中身が、そのままリストの要素名になるので、後の処理がとても楽になります。

df_gmean_list <- 
  split(df_group_mean, df_group_mean$種類)

df_gmean_list
## $アデリー
## # A tibble: 1 × 4
##   種類     bill_length_mm_m     n bill_depth_mm_m
##   <chr>               <dbl> <int>           <dbl>
## 1 アデリー             38.8   151            18.3
## 
## $ジェンツー
## # A tibble: 1 × 4
##   種類       bill_length_mm_m     n bill_depth_mm_m
##   <chr>                 <dbl> <int>           <dbl>
## 1 ジェンツー             47.5   123            15.0
## 
## $ヒゲ
## # A tibble: 1 × 4
##   種類  bill_length_mm_m     n bill_depth_mm_m
##   <chr>            <dbl> <int>           <dbl>
## 1 ヒゲ              48.8    68            18.4

3.2.2 リストの各要素を個別でExcelファイルに保存する

purrrパッケージのimap()関数を使って、リスト内の各データフレームに、それぞれの要素名をファイル名として、Excelファイルに出力します。

ここでは、リスト内の各要素を示すのが.x、要素名(位置)に当たるのは.yです。次々に代わるファイル名を作るのに、str_c()関数で文字列を結合しています。

imap(df_gmean_list, ~write_xlsx(.x, path = str_c("out/", .y , ".xlsx")))

3.2.2.1 サンプルデータセット作成コード

ちなみにdata/複数/フォルダにあるサンプルデータセットは以下のコードで作りました。

imap(df_list, ~write_xlsx(.x, path = str_c("data/複数/",.y , ".xlsx")))

3.2.3 一つのファイルの複数シートに保存する

3.2.1で作成した、ペンギンの種類別クチバシの長さと大きさ平均値のデータを、個別のファイルでなく、一ファイルの複数シートに保存したいときは、とてもシンプルなコードで可能になります。

要素名のついたデータフレームのリストが作成されていれば、それを単純にwrite_xlsx()で出力するだけで完成します。

write_xlsx(df_gmean_list, "data/平均値(複数シート).xlsx")