R_FOR LOOP & PURRR MAP_20240831

テーマ

Conductor
Conductor

FOR LOOP & PURRR MAP(繰り返し処理)

Wrangling

Wrangler
Wrangler

全体像はこんな感じ

source: https://www.business-science.io/
library(tidyverse)
library(fs) # fsはファイルシステムを操作する関数
file_paths <- fs::dir_ls("001_read_multiple_files/data") # fs::dir_lsはdirectory内のfileをlistで取得。
file_paths
# 1.0 FOR LOOP ----
file_contents <- list() #空リストに名前をつける。事前準備。
for (i in seq_along(file_paths)) { file_contents[[i]] <- read_csv( file = file_paths[[i]] )
}
file_contents <- set_names(file_contents, file_paths)
# 2.0 PURRR MAP ----
file_paths %>% map(function (path) { read_csv(path) })

Visualization

Visualizer
Visualizer

データを視える化

file_pathsの中身は以下のようなリストになっている。

file_contentsという名前で作成したList()の中身が入った段階。

Loop処理について。

1. file_contents <- list()

  • 概要: 空のリストを作成しています。このリストは後で読み込んだデータを格納するために使用されます。
  • 役割: CSVファイルの内容を保存するリストの初期化。

2. for (i in seq_along(file_paths)) { ... }

  • 概要: file_pathsの要素数分だけループを実行します。
  • seq_along(file_paths): これはfile_pathsの長さと同じ長さのシーケンスを生成します。例えば、file_pathsが3つのパスを持っていれば、seq_along(file_paths)1, 2, 3のシーケンスを返します。
  • i: ループのカウンターとして機能し、file_pathsのインデックスとして使用されます。

3. file_contents[[i]] <- read_csv(file = file_paths[[i]])

  • 概要: file_pathsの各要素(ファイルパス)に対して、そのファイルを読み込み、file_contentsリストの対応する位置に格納します。
  • read_csv(file = file_paths[[i]]): read_csv関数を使って、指定されたファイルパスからCSVファイルを読み込みます。file_paths[[i]]i番目のファイルパスを指します。
  • file_contents[[i]] <-: 読み込んだデータをfile_contentsリストのi番目の位置に格納します。

4. file_contents <- set_names(file_contents, file_paths)

  • 概要: file_contentsリストの各要素に、対応するファイルパスを名前として設定します。
  • set_names(file_contents, file_paths): file_contentsリストの名前をfile_pathsの各要素に基づいて設定します。これにより、リストの各要素に対応するファイルパスの名前が付けられ、データの参照が容易になります。
  • i番目で読み込んだfile_pathsとfile_contentsは一致するように扱われるので、i番目という共通項で突合しているイメージです。

全体の流れ

  1. 空のリストfile_contentsを作成。
  2. file_pathsに含まれるすべてのファイルパスに対してループを実行。
  3. 各ファイルを読み込み、その内容をfile_contentsに格納。
  4. 最後に、file_contentsリストに対応するファイルパスの名前を付ける。
  5. このコードを使うと、file_pathsリストに指定されたすべてのCSVファイルを読み込み、それらを名前付きリストとして簡単に操作することができます。
  6. 要するに、例えば、多くのCSVファイルがある場合で、①同ファイルをリスト化して、②各ファイル名は格納ファイル名として、③各ファイルをテーブル形式で保持したい時に使える。

PURRR MAPの処理について。

前述のforループを使用したコードと同じ処理を異なる方法で実行しています。file_pathsに含まれる各ファイルパスに対してCSVファイルを読み込み、その結果をリストとして返す処理です。これを行うために、purrrパッケージのmap関数を使用しています。

コードの詳細な説明

1. file_paths %>%

  • 概要: これはRのパイプ演算子(%>%)で、dplyrやmagrittrなどのパッケージで提供されるものです。左側のオブジェクト(この場合はfile_paths)を右側の関数に渡すために使用されます。
  • 役割: file_pathsリストを次の処理に渡します。

2. map(function (path) { read_csv(path) })

  • map(): これはpurrrパッケージの関数で、リストやベクトルの各要素に対して指定された関数を適用し、その結果をリストとして返します。Pythonのmap()関数や他のプログラミング言語の同様の関数に似ています。
  • function(path) { read_csv(path) }: map関数の引数として匿名関数(ラムダ関数)を定義しています。この関数はpathを引数として取り、それを使ってread_csvを呼び出します。各ファイルパス(path)に対してCSVファイルを読み込み、そのデータフレームを返します。

全体の処理の流れ

  1. file_pathsの各要素(ファイルパス)に対してmap関数を適用します。
  2. 各ファイルパスをread_csv関数に渡して、CSVファイルを読み込みます。
  3. すべての結果をリストとして返します。

例としての処理の結果

もしfile_pathsが次のように定義されているとします。

file_paths <- c("file1.csv", "file2.csv", "file3.csv")

このコードを実行すると、次のようなリストが返されます。

result <- list( read_csv("file1.csv"), # file1.csvの内容が格納される read_csv("file2.csv"), # file2.csvの内容が格納される read_csv("file3.csv") # file3.csvの内容が格納される
)

結論

  • はい、file_paths %>% map(function (path) { read_csv(path) })は、以前のforループを使ったコードと同じことを行っています。両方の方法で、file_pathsの各ファイルパスに対してread_csvを適用し、その結果をリストとして格納します。
  • mapを使用する方法は、コードがより簡潔で読みやすくなる利点があり、purrrパッケージの他の関数と組み合わせて使うことで、より複雑なデータ処理にも対応しやすくなります。

lamda関数(匿名関数)に関して。

はい、ラムダ関数(lambda関数)は、function()を使って定義する匿名関数のことを指します。Rにおいて、function()を用いて作成される関数も匿名関数と呼ばれることがあり、これが一般的に「ラムダ関数」として理解されています。

ラムダ関数(匿名関数)の定義と使用

ラムダ関数は、通常の関数のように名前を付けず、その場限りで使用する小さな関数です。関数を引数として受け取る高階関数(例えば、map()apply()など)でよく使われます。

Rでの例

# 通常の関数定義
add <- function(x, y) { x + y
}
# ラムダ関数(匿名関数)の使用
add_lambda <- function(x, y) { x + y }
result <- add_lambda(3, 4) # 結果は7

上記の例で示したfunction(x, y) { x + y }が、ラムダ関数の典型的な例です。関数に名前(この場合はadd_lambda)を付けて呼び出していますが、名前を付けない場合は「匿名関数」となります。

map()関数内での使用例

以下の例は、map()関数でラムダ関数を使用する典型的なケースです。

library(purrr)
# ファイルパスのリスト
file_paths <- c("file1.csv", "file2.csv", "file3.csv")
# ラムダ関数を使ってCSVファイルを読み込む
file_contents <- file_paths %>% map(function(path) { read_csv(path) })
  • map(function(path) { read_csv(path) })の部分がラムダ関数です。
  • function(path)のように、引数pathを受け取る関数をその場で定義し、read_csv(path)を実行する小さな関数を定義しています。
  • この関数には名前がなく、その場で定義されて実行されるだけなので「匿名関数」、または「ラムダ関数」と呼ばれます。

結論

  • ラムダ関数匿名関数は、同じものを指します。
  • Rでは、function()構文を使ってその場で定義される関数をラムダ関数と呼びます。
  • これらの関数は、高階関数の引数として、または一時的な用途で頻繁に使用されます。

Raw data

Source: https://www.business-science.io/

#Script on Rstudio
mpg_tbl <- read_csv("083_gwalkr/data/mpg.csv")
walmart_sales_tbl <- read_csv("083_gwalkr/data/walmart_sales.csv")

Data Structure :

Extractor
Extractor

元々のデータフレーム

Wrangler
Wrangler

Visualization直前のデータフレーム:今回は加工なし!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA