R×purrr::map2_vec 2つのリストまたはベクトルの各要素に関数を適用しベクトルを返す

R言語で、2つのリストまたはベクトルの各要素に関数を適用しベクトルを返す方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのmap2_vec()を使用した方法についてお伝えします。

map2_vec()の概要

map2_vec()は、2つのリストまたはベクトルの各要素に関数を適用しベクトルを返すための関数です。この関数は、一度に2つの引数を反復処理するmap()のバリエーションです。

map2_vec()の使い方


map2_vec(.x, .y, .f, ..., .ptype = NULL, .progress = FALSE)

map2_vec()の引数

.x, .y

リストまたはベクトルを指定します。
長さが異なる場合は、長さ1のリストまたはベクトルがもう一方の長さに再利用されます。

.f

関数を指定します。
以下のいずれかの方法で指定します。

  • 名前付き関数(例:mean)
  • 無名関数(例: ⁠ ⁠\(x, y) x + y⁠ または function(x, y) x + y
  • 数式(例:~ .x + .y)。xの現在の要素を参照するには.xを使用し、yの現在の要素を参照するには.yを使用する必要があります。現在は推奨されません。

[試験的]
関数を並列処理することを宣言するには、in_parallel()でラップします。詳細はin_parallel()を参照してください。このコンテキストでは…の使用は許可されていません。

関数に渡される追加の引数を指定します。
.fに追加の(定数)引数を渡す際に…を使用することは、現在では一般的に推奨されていません。代わりに、省略形の匿名関数を使用してください。


# 下記の代わりに
x |> map(f, 1, 2, collapse = ",")
# 以下のようにしてください。
x |> map(\(x) f(x, 1, 2, collapse = ","))

これにより、どの引数がどの関数に属しているかがわかりやすくなり、エラーメッセージもわかりやすくなります。

ptype = NULL

NULL(デフォルト)の場合、出力型は結果の要素の共通型になります。それ以外の場合は、希望する出力型を示す「プロトタイプ」を指定してください。

.progress = FALSE

プログレスバーを表示するかどうかを指定します。
TRUEを指定すると基本的なプログレスバーが表示されます。文字列で名前を付けることもできます。詳細についてはprogress_barsを参照してください。

map2_vec()の戻り値

.fが返すのと同じ型のアトミックベクトルまたはS3ベクトルを返します。.fは、長さが1であれば、ほぼすべての型のベクトルを返すことができます。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

使用例

2つのベクトルにmap2_vec()を適用すると次のようになります。


x <- c("A", "B", "C")
y <- c(1, 2, 3)
map2_vec(x, y, \(x, y) factor(paste(x, y, sep = "+")))

[1] A+1 B+2 C+3
Levels: A+1 B+2 C+3