0Pricing
R Academy · レッスン

複数の入力に対応するmap2()とpmap()

map2()とpmap()を使い、2つ以上のリストを同時に反復処理します。

「複数の入力に対応するmap2()とpmap()」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

複数の入力に対する反復

map()は一度に1つの入力を反復します。しかし、多くの関数では2つ以上の並列入力が必要です。purrrのmap2()は2つの入力を、pmap()は任意の数の入力を処理します。どちらも、型安全な戻り値を保証するという同じ仕組みを維持しています。

library(purrr)

# Simulate: add corresponding elements from two vectors
x <- c(1, 2, 3, 4)
y <- c(10, 20, 30, 40)

# map2 applies fn(x[i], y[i]) for each i
result <- map2(x, y, function(a, b) a + b)
print(result)

map2() — 2つの並列入力

map2(.x, .y, .f)は、.xと.yの対応する要素に対して.f(x_i, y_i)を適用します。両方のベクトルは同じ長さである必要があります(または、一方の長さが1でリサイクルされる場合も可能です)。リストを返します。

library(purrr)

names_vec <- c('Alice','Bob','Carol')
scores_vec <- c(85, 92, 78)

# Build a personalized message for each student
map2_chr(names_vec, scores_vec,
         ~paste(.x, 'scored', .y, 'points'))

~の省略記法を使ったmap2()

数式形式の省略記法~exprはmap2()でも使えます。.xは1つ目の入力を、.yは2つ目の入力を参照します。これにより、2引数の匿名関数を簡潔に記述できます。

library(purrr)

lower_bounds <- c(0, 10, 20, 50)
upper_bounds <- c(9, 19, 49, 100)

# Create labels for each range
map2_chr(lower_bounds, upper_bounds,
         ~paste0('[', .x, '-', .y, ']'))

型付きmap2()バリアント

map()と同様に、map2()にも型安全な戻り値を得るための型付きバリアントがあります。map2_dbl()、map2_chr()、map2_lgl()、map2_int()、map2_df()です。期待する出力の型に合ったバリアントを使用してください。

library(purrr)

actual <- c(100, 150, 200, 120)
target <- c(110, 140, 195, 130)

# Numeric: percentage achievement
map2_dbl(actual, target, ~round(100 * .x / .y, 1))

# Logical: did they meet their target?
map2_lgl(actual, target, ~.x >= .y)

pmap() — 任意の数の入力

pmap(.l, .f)は、最初の引数としてベクトルのリストを受け取ります。各ベクトルが個別の入力ストリームになります。関数は、すべての入力ストリームから対応する要素を同時に受け取ります。

library(purrr)

# Three parallel inputs
params <- list(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78),
  grade = c('B','A','C')
)

pmap_chr(params, function(name, score, grade) {
  paste(name, ':', score, '(', grade, ')')
})

データフレームでpmap()を使う

データフレームは列のリストなので、pmap()の最初の引数にデータフレームを直接渡せます。関数は1行分の値を名前付き引数として受け取り、列名がパラメーター名に対応します。

library(purrr)

params_df <- data.frame(
  mean_val = c(0, 5, 10),
  sd_val = c(1, 2, 3),
  n = c(100, 50, 200)
)

# Generate samples from different normal distributions
set.seed(42)
results <- pmap(params_df, function(mean_val, sd_val, n) {
  rnorm(n, mean=mean_val, sd=sd_val)
})

map_dbl(results, mean)

パラメーターグリッドの反復

pmap()の一般的な用途の1つは、モデルパラメーターのグリッドを反復することです。expand.grid()またはtidyr::expand_grid()でパラメーターの組み合わせを作成し、続いてpmap()で各行に対して実験を実行します。

library(purrr)

# Create a parameter grid
grid <- expand.grid(
  learning_rate = c(0.01, 0.1),
  epochs = c(10, 50),
  batch_size = c(32, 64)
)

# Simulate model training results
set.seed(42)
grid$accuracy <- pmap_dbl(grid, function(learning_rate, epochs, batch_size) {
  base <- 0.5 + 0.3 * log10(epochs) + 0.1 * learning_rate
  round(min(base + rnorm(1, 0, 0.02), 0.99), 3)
})

print(grid[order(-grid$accuracy),])

map2_df() — データフレームの作成

map2_df()(またはmap2_dfr())は、2つの並列入力に関数を適用し、結果のデータフレームを行方向に結合します。2つの項目集合を比較したり、並列するデータセットを結合したりする場合に強力です。

library(purrr)

q1_sales <- list(East=100, West=200, North=80)
q2_sales <- list(East=120, West=190, North=95)

map2_df(q1_sales, q2_sales, function(q1, q2) {
  data.frame(
    q1 = q1,
    q2 = q2,
    change = q2 - q1,
    pct = round(100*(q2-q1)/q1, 1)
  )
}, .id = 'region')

pmap()とnest()の組み合わせ

ネストしたデータフレームとモデルパラメーターをpmap()と組み合わせると、強力なパターンを利用できます。ハイパーパラメーターとデータを1つのデータフレームに格納し、行に対してpmap()を実行することで、各パラメーターセットでモデルを適合できます。

library(purrr)
library(dplyr)

# Simulate polynomial regression with different degrees
set.seed(42)
x <- 1:20
y <- 2*x + 0.5*x^2 + rnorm(20, 0, 10)
df <- data.frame(x=x, y=y)

configs <- data.frame(degree = 1:3)
configs$r2 <- map_dbl(configs$degree, function(d) {
  m <- lm(y ~ poly(x, d), data=df)
  summary(m)$r.squared
})

print(configs)

possibly()によるエラー処理

map2()/pmap()の処理では、1つの不正な入力によって処理全体が停止する可能性があります。関数をpossibly(fn, otherwise=NA)でラップすると、エラーを捕捉して既定値を返せるため、一部の入力で失敗してもパイプラインを継続できます。

library(purrr)

safe_log <- possibly(log, otherwise=NA_real_)

values <- list(10, -5, 100, 0, 50)

# Without possibly(): log() warns for negative numbers
# With possibly(): errors return NA, computation continues
map_dbl(values, safe_log)

実践:pmap()による交差検証

pmap()の実践的な用途として、フォールドの割り当てを反復してk分割交差検証を実行できます。pmap()は各フォールドの訓練データとテストデータを適合関数に渡し、フォールドごとに性能指標を返します。

library(purrr)

set.seed(42)
df <- data.frame(x=1:20, y=2*(1:20)+rnorm(20,0,3))
df$fold <- sample(rep(1:5, 4))

# Compute RMSE for each held-out fold
folds <- 1:5
rmse_vals <- map_dbl(folds, function(k) {
  train <- df[df$fold != k, ]
  test <- df[df$fold == k, ]
  m <- lm(y ~ x, data=train)
  preds <- predict(m, newdata=test)
  sqrt(mean((test$y - preds)^2))
})

cat('Per-fold RMSE:', round(rmse_vals, 2), '\n')
cat('Mean RMSE:', round(mean(rmse_vals), 2))

理解度チェック

2つを超える並列入力ベクトルを同時に反復するには、どのpurrr関数が適していますか?

まとめ:map2()とpmap()

複数入力のマッピングの要点:

  • map2(.x, .y, .f) — 2つの並列入力を反復します。~の省略記法では.xと.yを使います
  • map2_dbl/chr/lgl/int/df() — 型安全な戻り値を得るための型付きバリアントです
  • pmap(.l, .f) — 任意の数のベクトルからなるリストを同時に反復します
  • データフレームをpmap()に渡すと、列名が関数のパラメーター名になります
  • パラメーターグリッドの探索にはexpand.grid() + pmap()を使用します
  • 安全なエラー処理には関数をpossibly(fn, NA)でラップします
library(purrr)

# pmap with a data frame: each row = one function call
params <- data.frame(
  mean_val = c(0, 10, 100),
  sd_val = c(1, 5, 20),
  label = c('control','mid','high')
)

pmap_chr(params, function(mean_val, sd_val, label) {
  sprintf('%s: mean=%.0f, sd=%.0f', label, mean_val, sd_val)
})

よくある質問

「複数の入力に対応するmap2()とpmap()」レッスンは無料ですか?

はい。「複数の入力に対応するmap2()とpmap()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「複数の入力に対応するmap2()とpmap()」で何を学びますか?

map2()とpmap()を使い、2つ以上のリストを同時に反復処理します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「複数の入力に対応するmap2()とpmap()」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. map()と型付きバリエーション
  2. 複数の入力に対応するmap2()とpmap()
  3. reduce()、accumulate()、walk()
  4. keep()、discard()、リストのフィルタリング
← R Academyに戻る