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フィードバックを取得できます。ローカル設定は不要です。