0Pricing
R Academy · レッスン

map()と型付きバリエーション

map()、map_dbl()、map_chr()、map_lgl()でリストに関数を適用します。

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

purrr による関数型プログラミング

purrr パッケージは、Rで関数型プログラミングを行うための一貫性があり、型安全なツールを提供します。for ループを書く代わりに、リストやベクトルに対して関数をマップします。その結果、コードがより簡潔になり、動作を理解しやすく、組み合わせやすくなります。

library(purrr)

# A list of numbers
numbers <- list(1, 4, 9, 16, 25)

# Apply sqrt() to each element
result <- map(numbers, sqrt)
print(result)

map() — 常にリストを返す

map(.x, .f) は .x の各要素に関数 .f を適用し、リストを返します。入力にはリスト、ベクトル、データフレームを指定できます(データフレームの場合は列を反復処理します)。最も汎用的な map の形式です。

library(purrr)

# Map over a character vector
fruits <- c('apple', 'banana', 'cherry')

# nchar() counts characters in each string
result <- map(fruits, nchar)
print(result)  # Returns a list
print(class(result))

map_dbl() — 数値ベクトルを返す

map_dbl(.x, .f) は .x に対して .f をマップし、数値(double)ベクトルを返します。結果のいずれかが単一の数値でない場合はエラーになります。この型安全性により、バグを早期に発見できます。

library(purrr)

groups <- list(
  A = c(10, 20, 30),
  B = c(5, 15, 25, 35),
  C = c(100, 200)
)

# Compute mean for each group — returns a named numeric vector
means <- map_dbl(groups, mean)
print(means)
print(class(means))

map_chr() — 文字列ベクトルを返す

map_chr(.x, .f) はマップ処理を行い、文字列ベクトルを返します。文字列属性の抽出、結果の整形、ファイルパスの作成などに便利です。関数は各要素に対して1つの文字列を返す必要があります。

library(purrr)

models <- list(
  m1 = lm(mpg ~ wt, data=mtcars),
  m2 = lm(mpg ~ hp, data=mtcars),
  m3 = lm(mpg ~ cyl, data=mtcars)
)

# Extract the formula from each model as a string
map_chr(models, function(m) deparse(formula(m)))

map_lgl() — 論理ベクトルを返す

map_lgl(.x, .f) は TRUE/FALSE の値からなる論理ベクトルを返します。リスト全体で条件をテストするのに最適です。たとえば、どの要素が基準を満たすかを確認できます。

library(purrr)

datasets <- list(
  df1 = data.frame(x=1:3, y=c(NA,2,3)),
  df2 = data.frame(x=1:3, y=4:6),
  df3 = data.frame(x=c(NA,NA,3), y=1:3)
)

# Does each data frame contain any NA values?
map_lgl(datasets, function(df) anyNA(df))

map_int() — 整数ベクトルを返す

map_int(.x, .f) は整数ベクトルを返します。関数が個数、インデックス、その他の整数の結果を返す場合に使用します。なお、Rでは length() と nrow() は整数を返します。

library(purrr)

my_lists <- list(
  a = 1:10,
  b = letters[1:5],
  c = c(TRUE, FALSE, TRUE, TRUE)
)

# Count elements in each list item
map_int(my_lists, length)

map_df() / map_dfr() — データフレームを返す

map_df(.x, .f)(別名:map_dfr())は、各要素に.fを適用し、その結果を行方向に結合して1つのデータフレームにします。各要素に対して、関数はデータフレームまたはtibbleを返す必要があります。map_dfc()は列方向に結合します。

library(purrr)

files <- c('sales_q1', 'sales_q2', 'sales_q3')

# Simulate reading and labeling each file
map_df(files, function(f) {
  data.frame(
    file = f,
    rows = sample(50:100, 1),
    cols = 5
  )
})

~を使った匿名関数

purrrは、匿名関数を簡潔に記述するための数式形式の省略記法をサポートしています。~exprの.xは現在の要素を参照します。これによりfunction(x) exprと書く必要がなくなり、コードを簡潔に保てます。どちらの形式も同じように動作します。

library(purrr)

numbers <- list(1, 4, 9, 16, 25)

# Three equivalent ways:
result1 <- map(numbers, function(x) x^2)
result2 <- map(numbers, ~.x^2)
result3 <- map_dbl(numbers, ~.x^2)

print(result2)
print(result3)

名前付きリストに対するマッピング

.xが名前付きリストまたはベクトルの場合、map()の出力にはその名前が保持されます。map_dbl()などの型付きバリアントでも名前が引き継がれるため、結果の内容が分かりやすくなります。

library(purrr)

region_data <- list(
  East = c(100, 120, 115, 130),
  West = c(200, 195, 210, 205),
  North = c(80, 85, 90, 88)
)

# Named results
map_dbl(region_data, mean)

データフレームの列でmap()を使う

データフレームは列のリストです。map(df, fn)は各列にfnを適用します。map_dbl()と組み合わせると、すべての列の統計量を一度に計算する簡潔な方法になります。

library(purrr)

df <- data.frame(
  score_a = c(85, 90, 78, 92),
  score_b = c(88, 85, 80, 95),
  score_c = c(92, 88, 84, 90)
)

# Mean of every column
map_dbl(df, mean)

map()呼び出しのネスト

複数レベルの反復では、map()呼び出しをネストできます。外側のmapでグループを反復し、内側のmapでパラメーターを反復します。これにより、ネストしたforループを、読みやすく組み合わせ可能な構造に置き換えられます。読みやすさを保つため、ネストの深さは2レベルまでにしてください。

library(purrr)

groups <- list(A = 1:5, B = 6:10)
functions <- list(mean=mean, sd=sd, min=min)

# Apply each function to each group
map(groups, function(g) {
  map_dbl(functions, function(f) f(g))
})

理解度チェック

map()とmap_dbl()の主な違いは何ですか?

まとめ:map()と型付きバリアント

map()と型付きバリアントの要点:

  • map(.x, .f) — 常にリストを返すため、最も柔軟です
  • map_dbl() — 数値ベクトルを返し、型が異なるとエラーになります
  • map_chr() — 文字ベクトルを返します
  • map_lgl() — 論理ベクトルを返します
  • map_int() — 整数ベクトルを返します
  • map_df() / map_dfr() — 結果を行方向に結合してデータフレームにします
  • ~.xの省略記法 — 匿名関数を簡潔に記述する構文です
  • 名前付き入力からは、自動的に名前付き出力が生成されます
library(purrr)

# Typed map showcase
data_list <- list(
  group_A = c(10, 20, 30),
  group_B = c(5, 15),
  group_C = c(100, 200, 300, 400)
)

cat('Counts:', map_int(data_list, length), '\n')
cat('Means: ', map_dbl(data_list, mean), '\n')
cat('Any>50:', map_lgl(data_list, ~any(.x > 50)), '\n')

よくある質問

「map()と型付きバリエーション」レッスンは無料ですか?

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

「map()と型付きバリエーション」で何を学びますか?

map()、map_dbl()、map_chr()、map_lgl()でリストに関数を適用します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「map()と型付きバリエーション」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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