FOR LOOP & PURRR MAP(繰り返し処理)
全体像はこんな感じ
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) })
データを視える化
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番目という共通項で突合しているイメージです。
全体の流れ
- 空のリスト
file_contents
を作成。 file_paths
に含まれるすべてのファイルパスに対してループを実行。- 各ファイルを読み込み、その内容を
file_contents
に格納。 - 最後に、
file_contents
リストに対応するファイルパスの名前を付ける。 - このコードを使うと、
file_paths
リストに指定されたすべてのCSVファイルを読み込み、それらを名前付きリストとして簡単に操作することができます。 - 要するに、例えば、多くの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ファイルを読み込み、そのデータフレームを返します。
全体の処理の流れ
file_paths
の各要素(ファイルパス)に対してmap
関数を適用します。- 各ファイルパスを
read_csv
関数に渡して、CSVファイルを読み込みます。 - すべての結果をリストとして返します。
例としての処理の結果
もし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()
構文を使ってその場で定義される関数をラムダ関数と呼びます。 - これらの関数は、高階関数の引数として、または一時的な用途で頻繁に使用されます。
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 :
元々のデータフレーム
Visualization直前のデータフレーム:今回は加工なし!