R言語で、リストの要素に値をマージする方法について解説します。リストの操作は様々な方法がありますが、ここではtidyverseパッケージに含まれているpurrrパッケージのlist_merge()を使用した方法についてお伝えします。

list_merge()の概要

list_merge()は、リストの要素に値をマージするするための関数です。

list_merge()の使い方

purrr::list_merge()の使い方は次になります。


list_merge(.x, ..., .is_node = NULL)

list_merge()の引数の意味

.x

変更するリストを指定します。

リストの新しい値を指定します。
値を削除するにはzap()を使用します。これらの値は、すべて名前付きかすべて名前なしのいずれかである必要があります。入力がすべて名前付きの場合、名前によって.xと一致します。すべて名前なしの場合、位置によって一致します。動的ドットがサポートされています。特に、置換値がリストに格納されている場合は、それを「⁠!!!」で結合できます。

.is_node = NULL

要素がノード(TRUEを返す)かリーフ(FALSEを返す)かを判断する述語関数を指定します。
デフォルト値NULLは、vctrs::vec_is_list()を使用して、単純なリストをノードとして扱い、その他すべて(データフレームや線形モデルなどのより豊富なオブジェクトを含む)をリーフとして扱います。リスト上に構築されたすべてのオブジェクトを再帰するには、is.list()を使用します。

準備

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


library(tidyverse)

解説のために、次のリストを使用します。


x <- list(
    x1 = 1:3,
    y1 = letters[1:5],
    z1 = list(
        x2 = 10:13,
        y2 = LETTERS[10:15]
      )
  )
x

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"

list_merge()で要素に値をマージ

リストの要素に値をマージするには次のようにします。


list_merge(
    x,
    x1 = 10:13,
    y1 = LETTERS[6:10],
    z1 = list(
        x2 = 20:23,
        y2 = letters[16:20]
      )
  )

$x1
[1]  1  2  3 10 11 12 13

$y1
 [1] "a" "b" "c" "d" "e" "F" "G" "H" "I" "J"

$z1
$z1$x2
[1] 10 11 12 13 20 21 22 23

$z1$y2
 [1] "J" "K" "L" "M" "N" "O" "p" "q" "r" "s" "t"
R×purrr::list_merge リストの要素に値をマージする