0Pricing
R Academy · 강의

여러 입력을 위한 map2()와 pmap()

map2()와 pmap()으로 두 개 이상의 목록을 동시에 순회합니다.

여러 입력을 위한 map2()와 pmap()은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

여러 입력에 대해 반복하기

map()은 한 번에 하나의 입력을 순회합니다. 하지만 많은 함수에는 두 개 이상의 병렬 입력이 필요합니다. purrr의 map2()는 두 입력을 처리하고, 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() — 두 개의 병렬 입력

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는 첫 번째 입력을, .y는 두 번째 입력을 가리킵니다. 따라서 두 인수를 받는 익명 함수를 간결하게 작성할 수 있습니다.

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()의 첫 번째 인수로 직접 전달할 수 있습니다. 함수는 한 행의 값을 이름이 지정된 인수로 받으며, 열 이름이 매개변수 이름에 대응합니다.

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()의 일반적인 사용 사례는 모델 매개변수의 격자를 순회하는 것입니다. 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())는 두 개의 병렬 입력에 함수를 적용하고 그 결과로 나온 데이터 프레임을 행으로 결합합니다. 두 항목 집합을 비교하거나 병렬 데이터 집합을 병합할 때 매우 유용합니다.

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()을 중첩된 데이터 프레임 및 모델 매개변수와 함께 사용하면 강력한 패턴을 구현할 수 있습니다. 하나의 데이터 프레임에 하이퍼매개변수와 데이터를 저장한 다음 행을 대상으로 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() 작업 흐름에서는 하나의 잘못된 입력만으로 전체 작업이 중단될 수 있습니다. 함수를 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))

빠른 확인

두 개보다 많은 병렬 입력 벡터를 동시에 순회할 때 적절한 purrr 함수는 무엇입니까?

복습: map2()와 pmap()

여러 입력에 매핑할 때의 핵심 내용:

  • map2(.x, .y, .f) — 두 개의 병렬 입력을 순회하며, ~ 축약형에서는 .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/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“여러 입력을 위한 map2()와 pmap()”에서 뭘 배우나요?

map2()와 pmap()으로 두 개 이상의 목록을 동시에 순회합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“여러 입력을 위한 map2()와 pmap()” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. map()과 형식별 변형
  2. 여러 입력을 위한 map2()와 pmap()
  3. reduce(), accumulate(), walk()
  4. keep(), discard(), 목록 필터링
← R Academy(으)로 돌아가기