R×purrr::lmap_at リストのリスト要素に対して指定した番号または名前に該当したときに関数を適用する

R言語で、リストのリスト要素に対して指定した番号または名前に該当したときに関数を適用する方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのlmap_at()を使用した方法についてお伝えします。

lmap_at()の概要

lmap_at()は、リストのリスト要素に対して指定した番号または名前に該当したときに関数を適用するための関数です。lmap_at()は、map_at()と似ていますが、.x[[i]]をマッピングする代わりに、.x[i]をマッピングします。これにはいくつかの利点があります。

  • リストのみを受け取る関数を扱えるようになります。
  • .fがnames()のように、カプセル化されたリストの属性にアクセスできるようになります。
  • .fが、出力のサイズを変更することで、受け取ったリストよりも大きいリストまたは小さいリストを返すことができます。

lmap_at()の使い方


lmap_at(.x, .at, .f, ...)

lmap_at()の引数

.x

リストまたはデータフレームを指定します。

.at

選択する要素を指定する論理ベクトル、整数ベクトル、または文字ベクトルを指定します。
あるいは、名前のベクトルを受け取り、選択する要素の論理値、整数値、または文字ベクトルを返す関数を指定します。
[非推奨]: tidyselect パッケージがインストールされている場合は、vars()とtidyselectヘルパーを使用して要素を選択できます。

.f

長さ1のリストを受け取り、任意の長さのリストを返す関数を指定します。

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


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

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

lmap_at()の戻り値

.xに一致するリストまたはデータフレームを返します。長さは保証されません。

準備

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


library(tidyverse)

使用例

リストの要素名と値を同時に変更する

次は、3つのユーザー情報(user01, user02, user03)を持つリストを作成し、各要素名(user01, user02, user03)の末尾に「A」を追加し、nameを大文字に変換するコードです。
ただし、user01とuser03の場合にのみ適用されます。


list(user01 = list(id = 100, name = "satou", age = 30),
     user02 = list(id = 101, name = "suzuki", age = 40),
     user03 = list(id = 102, name = "takahashi", age = 50)) |>
  lmap_at(
    c("user01", "user03"),
    function(x) {
      names(x) <- paste0(names(x), "A")
      x[[1]]$name <- str_to_upper(x[[1]]$name)
      x
  })

$user01A
$user01A$id
[1] 100

$user01A$name
[1] "SATOU"

$user01A$age
[1] 30


$user02
$user02$id
[1] 101

$user02$name
[1] "suzuki"

$user02$age
[1] 40


$user03A
$user03A$id
[1] 102

$user03A$name
[1] "TAKAHASHI"

$user03A$age
[1] 50