須通り
Sudo Masaaki official site
For the reinstatement of
population ecology.

おまえが長くtidyverseを覗くならば、tidyverseもまた等しくおまえを見返すのだ。

重要事項:Tidyverse は2018年現在もリアルタイムで基本機能の追加・改訂が進んでいるホットな関数群です。このサイトの記事のみならず公式ヘルプの内容ですら、将来バージョンで非推奨になったり機能廃止になる可能性が多分にあります。実際の業務で使用する際は常にオンラインの最新ドキュメントを確認しましょう。

tidyr: Easily Tidy Data with 'spread()' and 'gather()' Functions

dplyr: A Grammar of Data Manipulation

readr: Read Rectangular Text Data

magrittr: A Forward-Pipe Operator for R

purrr: Functional Programming Tools

tibble: Simple Data Frames

knitr: A General-Purpose Package for Dynamic Report Generation in R

ホーム | 統計 Top | これまでの記事で扱ったTidyverse関数のあんちょこ

不定期更新。使用頻度が最も高い関数群に絞って、引数の詳細な指定法をニホンゴで解説する方針。本来のヘルプドキュメントからの意訳なので注意。掲載済みの記事から抜書しているので時々文脈が不明。掲載順や説明文をスドウくんの一存で変える場合あり。

目次

  1. tidyr
    • データフレームの列を集約して long 形式にする tidyr::gather 関数
    • データフレームの列の内容を展開して wide 形式にする tidyr::spread 関数
    • データフレームの列を集約して long 形式にする tidyr::pivot_longer 関数
    • データフレームの列の内容を展開して wide 形式にする tidyr::pivot_wider 関数
    • データ列ラベルを分割する tidyr::separate 関数
    • データ列ラベルを高度な正規分割表現に従って分割する tidyr::extract 関数
    • データ列ラベルを単純結合する tidyr::unite 関数
    • 複数のデータ列のユニークな組み合わせを返す tidyr::expand 関数
    • データフレームの変数組み合わせの欠損行をNA(or指定文字列)で補完する tidyr::complete 関数
    • グループに基づいて入れ子(階層化)された tibble を作る tidyr::nest 関数
    • nest() で階層化された tibble を flatten する tidyr::unnest 関数
    • tibble 内の列のリスト要素であるベクトルを、 tibble のトップレベルの列へと展開する hoist/unnest_wider/unnest_longer 関数
  2. dplyr
    • 複数の tidy なデータフレームの合意データを作る dplyr::*_join 関数ファミリー
    • 列の構成が等しい2つのデータフレームからの、一致行ないし非一致行の絞り込み
      観測データの積集合を返す dplyr::intersect(x, y) 関数
      観測データの和集合を返す dplyr::union(x, y) 関数
      x にはあるが y にない行を返す dplyr::setdiff(x, y) 関数
    • データフレームの行を条件で絞り込む dplyr::filter 関数
    • データフレームの列を条件で絞り込む dplyr::select 関数
    • データフレームの列を改名する dplyr::rename 関数
    • データフレームの行を並べ換える dplyr::arrange 関数
    • データフレームの行ごとにデータを操作する dplyr::mutate() 関数
    • データフレーム中の条件指定した列を一括で mutate する dplyr::mutate_at() 関数と dplyr::mutate_if() 関数
    • 処理対象列の処理後の姿だけをデータフレーム中に残しつつ mutate する dplyr::transmute() 関数
    • データフレームの列(変数)に着目して水準ごとにグループ化する dplyr::group_by 関数
    • テーブルに含まれる変数列に要約処理を施し、スカラー値を返す dplyr::summarise 関数
    • グループ化された tibble に反復処理を施すための purrr スタイルの関数 dplyr::group_map
    • テーブルから単一の値を引き出す dplyr::pull 関数
  3. purrr
    • 入力の各要素に関数を適用して変形を行い、入力と同じ長さのデータを出力する purrr::map 関数ファミリー
    • 複数の引数を取りながらグループごとに複雑な処理を行う map2, pmap 系関数
    • ベクトルないし環境から単一の要素を取ってくる pluck/chuck 関数
  4. 演算子 この節は未整理
    • magrittr::%>%(パイプ演算子)
    • magrittr::%T>%(Tee演算子)
  5. データ構造 当然必要だが解説未執筆
    • tibble(tibble)

tidyr


データフレームの列を集約して long 形式にする
tidyr::gather(data, key, value, ..., na.rm = FALSE, convert = FALSE, factor_key = FALSE)

省略不可な引数
data    処理対象のデータフレーム。
key    変換後のデータフレームに新規生成すべき key 列(=カテゴリのこと)の名前を指定。引用符で囲む必要はない。
value    変換後のデータフレームに新規生成すべき value 列(=データの値)の名前を指定。引用符で囲む必要はない。
...    変換前のデータフレームにある、Long形式にまとめてしまいたい列の名を(引用符なしで)1つ以上指定。
    変換後のデータフレームにおいて、指定された列の列名が key 列に格納され、データが value 列に格納される。
    変換前のデータフレームにある x から z までの間の全列を含めたい場合は x:z などとする。
    列 y を除外したければ -y などとする。さらなる詳細は dplyr::select() のドキュメントを参照。

オプション扱いの引数
na.rm    TRUE であるとき、value列が NA となるデータ行がもしあれば削除される。
convert    TRUEであるとき、 key 列に含まれるデータを自動で型変換する。元の列名が numeric, integer, or logical であるときに便利。
factor_key    デフォルトはFALSEで、key列の値は文字列ベクトルで格納される。TRUEであるとき、factor型に変換される。このとき元のデータフレームにおける列の順序が保存される。

データフレームの列の内容を展開して wide 形式にする
tidyr::spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE, sep = NULL)

省略不可な引数
data    データフレーム。
key     分類のキーとして用いる。元データに含まれる列を名前で指定。引用符で囲む必要はない。ここに格納されている値の水準数だけ、新しいデータ列が作られ、そこにvalueで指定したデータが格納される。
value    上記で分類したセルをpopulateするためのvalue。元データに含まれる列を名前で指定。引用符で囲む必要はない。

オプションの引数
fill    変換後のカテゴリに対応するデータ行が存在しないとき、ここに指定した値で置き換える。なお元データの該当行にNAが入っている場合も、ここで指定した値に置換される。
convert    TRUEであるとき、分類の結果生成された各列に対して、type.convert() 関数が as.is=TRUE として実行される。元の列に含まれている各変数が、複数のデータ型を文字列にまとめたものである場合にとりわけ有用。もし元のクラスがfactorないしdateであった場合、新たに生成される列は自動では同じ型として保存されないので、いったんcharacterにまとめてから変換する必要がある。
drop    FALSEであるとき、新しく生成されるfactor型のデータ列において存在しない水準は削除される。
sep    NULLであるとき、新たに生成される列の名前を key 列に格納されている変数の値そのものとして生成する。NULL以外であれば、<key_name><sep><key_value> という命名規則で作られる。

データフレームの列を集約して long 形式にする tidyr::pivot_longer 関数


データフレームの列を集約して long 形式にする tidyr::pivot_longer 関数
https://tidyr.tidyverse.org/reference/pivot_longer.html

pivot_longer(   data, cols, names_to = "name", names_prefix = NULL, names_sep = NULL,
                names_pattern = NULL, names_ptypes = list(), names_transform = list(),
                names_repair = "check_unique",
                values_to = "value", values_drop_na = FALSE, values_ptypes = list(),
                values_transform = list(), ...   )

data    処理対象のデータフレーム。
cols    longer 形式に変換したい列を <tidy-select> 方式で選択。Tidy-select って何さと思うが、要するに文字列ベクトルで直接指定してもいいし、starts_with("Treat") みたいに自動選択する企みをしてもいい。

####
names_to    上記で指定した cols の列名をデータとして取り込むべく、新規作成する列(ネーム列)に付ける列名。文字列で指定。

ネーム列を複数作りたい時は、names_to に複数の文字列をベクトルで与える。この場合は、cols の列名をどうやって複数の文字列に分割するかを指定するために names_sep もしくは names_pattern が必要。複数列に分割する場合、特別な値の指定方法が2通り存在する。

一つは NA(クォーテーション付けない)で 、このとき当該列は作成されず、闇に消える。例えば以下のような使い方をする。
tidypest.raw %>%
    tidyr::pivot_longer(cols=c("Treat.Before", "Treat.After", "Control.Before", "Control.After"),
                        names_to=c(NA, "Time"), names_sep="¥¥.", values_to="Value")

もう一つは ".value" である。部分的に long 変換したい場合に使える。つまり names_to=c("Treatment", ".value") とすることで、指定した 2 つの要因のうち前半の "Treatment" については伸ばしつつ、後半の Before/After については列構造を残せる。このとき、残る 2 列分の列名は不要であるから、もしも values_to があれば無視される。

names_prefix    作成されるネーム列において、cols に指定した各列の列名冒頭から除去したい文字があれば、正規表現で指定。挙動は以下のようになる。

####

以下はそこそこ使用するオプション引数。

names_sep, names_pattern    これらの引数は names_to が複数の値を含んでいた場合に使われ、col で指定した各列の中身を、どのようにネーム列の値へ分割するかを指定する。
names_sep は従来の separate() と同様の指定方法をサポートする。すなわち数値ベクトルで分割位置を指定するか、単一の正規表現文字列で分割文字を指定する。
names_pattern は従来の extract() と同様の指定方法をサポートする。すなわちマッチンググループを含む正規表現で指定する。
すごく複雑なパターンを処理する必要があり上2つで上手く行かない場合は、pivot_longer_spec() にて spec object を作る方法で手動制御する。

values_to    単一の文字列。col に指定した列たちの列名が、新規作成したネーム列(names_to で名前を指定する)の中身へまとめられるのに対して、col に指定した列たちのデータを格納するために新規作成されるデータ列の名前を指定するのが values_to である。

####

以下は、あまり使用機会がないオプションの引数。

names_ptypes, values_ptypes    それぞれ新規作成されるネーム列、バリュー列の prototype をリストに入れて指定する。プロトタイプ(略して p type)とは、integer() とか numeric() といった長さ0のベクトルであり、あるベクトルのデータ形式、クラス、および属性を定義する。
基本的には、作成する列のデータ形式を指定するために使う。無指定の場合は names_to で作成する列のデータ形式は文字列になり、values_to で作成される列のデータ形式は、input columns のデータを表現可能な共通の形式が選ばれる(須藤注:たとえば double と integer を統合するならば double が共通形式になるし、数値と文字列を同じ列に押し込めるには、数値 1 も文字列 "1" として扱う必要がある)。

# 公式にも使用例がないが、以下のようなことができる。
tidypest.raw %>%
    tidyr::pivot_longer(cols=c("Treat.Before", "Treat.After", "Control.Before", "Control.After"),
                        names_to=c("Treatment", "Time"), names_sep="¥¥.",
                        names_ptypes=list(Treatment=factor()))
# この場合、 Treatment 列が因子型になる。

names_transform, values_transform    (須藤注:tidyr 1.1.0 以降でないと動かないっぽい)それぞれ新規作成されるネーム列、バリュー列の、データ形式を変換する関数をリストで指定する。指定した名前を持つ列について、データ形式を変換したい場合に使う。たとえば names_transform = list(week = as.integer) とすると、新規作成する week という名前の列の中身が整数形式に変換される。

# こちらも公式に使用例がないが、以下のコードで Treatment が因子型になる。
tidypest.raw %>%
    tidyr::pivot_longer(cols=c("Treat.Before", "Treat.After", "Control.Before", "Control.After"),
                        names_to=c("Treatment", "Time"), names_sep="¥¥.",
                        names_transform=list(Treatment=as.factor))

names_repair    新規作成するネーム列が複数ある場合の列間での名前の重複や、既存列との名前の重複があった場合の回避処理。デフォルトは "check_unique" でエラーを返す。"minimal" は重複を許容する。"unique" は重複列の後に .1 とか .2 とか接尾辞を付加して重複を避ける。さらなるオプションは vctrs::vec_as_names() にある。

values_drop_na    デフォルトは FALSE。TRUE であった場合、もしも新規作成列の全行が NA になるような列があれば削除される。

...    追加の引数があれば。

データフレームの列の内容を展開して wide 形式にする tidyr::pivot_wider 関数


データフレームの列の内容を展開して wide 形式にする tidyr::pivot_wider 関数
https://tidyr.tidyverse.org/reference/pivot_wider.html

pivot_wider(data, id_cols = NULL, names_from = name, names_prefix = "", names_sep = "_",
            names_glue = NULL, names_sort = FALSE, names_repair = "check_unique",
            values_from = value, values_fill = NULL, values_fn = NULL, ...)

data    処理対象のデータフレーム。

names_from, values_from    それぞれ <tidy-select> 形式で列を指定する。前者は、出力列(output column)の列名を生成する際の、元ネタとして用いる列(1つでも複数でもいい)を指定する。
後者 values_from は、出力列のデータ内容になるべき列を指定する。もしも複数の列を指定したならば、values_from からの値が出力列の前に付加される。

####

以下はそこそこ使用するオプション引数。

names_prefix    展開後に作成される出力列の列名の冒頭に、付けたい文字列があれば。よく使われるシチュエーションは、names_from の中身がいずれも数値である場合。

names_sep    もしも names_from で複数の列を指定した場合、それらの列名を結合して新規列を命名するための繋ぎの文字を指定する。須藤注:pivot_longer の names_sep は正規表現だったが、pivot_wider では単なる文字列。たとえば "¥¥." とする必要はなく "." で、 Treat.Before みたいにピリオド1つの結合になる。

####

以下は、あまり使用機会がないオプションの引数。

id_cols    <tidy-select> 形式で列を指定する。データセットの各列を実験計画上の要因として捉えるとき、id_cols で指定された列セットについて、各行がユニークな水準の組み合わせに対応していることを示す。デフォルトでは names_from および values_from に使われなかった全ての列が、自動的に選択される。

須藤注:公式ヘルプが難解だが実際何が起こるかというと、id_cols, names_from, values_from のいずれにも指定されなかった列は、pivot_wider の際に展開されずに残る。pivot_longer の cols 引数とは異なることに注意。これを変更すべきシチュエーションは多くない。以下を実行すると分かるのだが、
tidypest.long %>%
    tidyr::pivot_wider(id_cols="Season", names_from=c("Treatment", "Time"), values_from="Value")

展開時に取り残された列は tibble の出力列内に入れ子構造として残る。上の例だと Site の 1:6 に相当するデータが、tibble の各セルに長さ6のベクトルとして格納される。Nested tibble の構造を知っている人なら扱えるが、初心者にはおすすめできない。

names_glue    列名の生成に names_sep や names_prefix を使う代わりに、生成規則を指定する glue specification を記述できる。たとえば以下
tidypest.long %>%
    tidyr::pivot_wider( names_from=c("Treatment", "Time"),
                        names_glue="{Treatment}_{Time}.{.value}", values_from="Value")
は、 Treat_Before.Value  Treat_After.Value みたいな列名を生成する。
なお、さらに複雑な生成規則が必要な場合は pivot_wider_spec() という関数も用意されている。

names_sort    names_from に含まれるユニークな水準から列名を生成する際に、ソートするか?デフォルトは FALSE で、たとえば tidypest.long$Treatment 列における出現順が Treat → Control であれば、展開後の列も左から Treat → Control の順になる。

names_repair    生成される列名が無効である場合の処理。デフォルトは "check_unique" で、既存列名と被ったり、新規に2つ同じ名前の列が生成されてしまう場合はエラーを出す。列名被りを許容する場合は "minimal"、 .1 や .2 などと接尾辞を付けて強引に名前被りを回避したい場合は "unique" を指定する。さらなるオプションは vctrs::vec_as_names() にある。

values_fill    欠損値を埋める文字列(スカラー)をオプションで指定できる。なおvalues_from を複数指定した場合、 named list で個別に指定することも可能。

values_fn    pivot_wider の操作結果が格納される各セルに、何らかの関数を適用するオプション。何でも id_cols と values_from に指定した列のコンビネーションが、ユニークな観察水準に対応しない場合に使うと良いらしい。

実際に公式ヘルプのページの最後に掲載されている例だと、 values_fn = mean を指定している。上にも書いたように id_cols に取りこぼしがあると、展開後の生成列の各セルが複数データ値のベクトルになってしまうのだが、そこにダメ押しで mean を適用することで、平均値という1つの値にまとめて(ネストされない平板な tibble で)出力できるという寸法だ。こちらも values_fill と同様、values_from の各列に対し、named list で個別に指定可能である。

...    追加の引数があれば。

データ列ラベルを分割する
tidyr::separate( data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,
          convert = FALSE, extra = "warn", fill = "warn", ...)

引数
data    データフレーム。
col    分割対象とするデータ列の名前、もしくはアドレス(何番目の列かを表す数値)。tidyselect::vars_pull() に渡される。引用符で囲む必要はない。
into    新しく作られる変数(複数ある)の名前を文字列ベクトルで指定。

sep    データ列の分割場所となる文字(セパレータ)。分割規則を文字列で与えるか、何番目の文字までを切り取るかを整数ベクトルとして指定する。
    文字列で与えた場合は正規表現として解釈される。デフォルトの "[^[:alnum:]]+" はアルファベットと半角数字以外、全ての文字で列を分割しようとする。
    数値(須藤注:整数ベクトル)で与えた場合は、正数であれば左から数えて(負数であれば右から)n 字までを切り取り、n+1字目から次の列が始まるよう分割される。sep 引数のベクトル要素は into の要素数より1つだけ少なく与えられるべきものである。

オプションの引数
remove    デフォルトは TRUE で、分割対象になった元のデータ列は関数の出力ファイルから取り除かれる。
convert    デフォルトはFALSEだが、もしも TRUE ならば、変換生成後のデータ列に type.convert() を as.is = TRUE として掛ける。元のデータが integer, numeric or logical であるときに有用。

extra    If sep is a character vector, this controls what happens when there are too many pieces. There are three valid options:
    "warn" (the default): emit a warning and drop extra values.
    "drop": drop any extra values without a warning.
    "merge": only splits at most length(into) times

fill    If sep is a character vector, this controls what happens when there are not enough pieces. There are three valid options:
    "warn" (the default): emit a warning and fill from the right
    "right": fill with missing values on the right
    "left": fill with missing values on the left
...    Additional arguments passed on to methods.

データ列ラベルを高度な正規分割表現に従って分割する
tidyr::extract(data, col, into, regex = "([[:alnum:]]+)", remove = TRUE, convert = FALSE, ...)

引数
data    データフレーム。
col    分割対象とするデータ列の名前もしくは場所(何番目の列か)。tidyselect::vars_pull() に渡される。引用符で囲む必要はない。
into    新しく作られる変数(複数ある)の名前を文字列ベクトルで指定。

regex    望ましい名前ラベルを抽出するための正規表現を1つ指定する。この正規表現に含まれるグループ(正規表現では () で囲むことで定義される)が、引数 into に入れた各要素と一対一対応する必要がある。

オプションの引数
remove    デフォルトは TRUE で、分割対象になった元のデータ列は関数の出力ファイルに含まれない。
convert    デフォルトはFALSE。もしも TRUE ならば、変換生成後のデータ列に type.convert() を as.is = TRUE として掛ける。元のデータが integer, numeric or logical であるときに有用。
...    正規表現を処理するため、regexec() に渡したい追加の引数があれば。

データ列ラベルを単純結合する
tidyr::unite(data, col, ..., sep = "_", remove = TRUE)

引数
data    データフレーム。
col    結合して作られる新たな列名。文字列ないしシンボルで与える。"" で囲んでも囲まなくてもいい。rlang::quo_name() の規則に従って渡されるが、実際のオブジェクトに対応しないシンボル名での指定は現在の tidyverse では非推奨であり、後方互換性のためだけに残されている。
...    結合対象の列を指定。何も指定しない場合、全データ列を選択。列名は "" で囲んでも囲まなくてもいい。列 x と列 z の間にある全てを選びたければ x:z としてよい。-y とすれば列 y を除外する。さらに詳細は dplyr::select() のドキュメントを参照。
sep    結合したデータの間に入るセパレータ文字列。デフォルトは "_" で、たとえば "Control_Before" などとなる。
remove    デフォルトは TRUE で、結合対象になった元のデータ列は関数の出力ファイルに含まれない。

複数のデータ列のユニークな組み合わせを返す
tidyr::expand(data, ...)

省略不可な引数
data    処理対象のデータフレーム。
...    どの列を expand するかの指定。

たとえば df という名のデータフレーム中に存在する列 x, y, z の各水準に対して、実際の df に欠けているものを含めて全てのユニークな組み合わせを作成するには
expand(df, x, y, z)
とすればいい。

####

サブ機能を提供する関数
crossing(...)
nesting(...)

crossing() は R の標準関数 expand.grid() とほぼ同じ機能を提供するが、文字列を factor 型データに変換することはしない。
nesting() は crossing() と相補的な働きをする関数で、crossing() が各変数の有する水準について、想定しうる全組み合わせを作るのに対し、nesting() は既にデータ中に存在する組み合わせのみを返す。

実際の df に含まれている x, y, z の組み合わせのみについて、重複を無くして列挙したいならば
expand(df, nesting(x, y, z))
として、対象の変数を nesting() で括る。

expand(df, nesting(x, y), z)
であれば、x と y については既存の組み合わせだけが抽出され、それらと z との間では想定しうる全組み合わせが作成される。

なお数値データ列に対しては、 year=2010:2020 とか year=full_seq(year, 1) などとして連続データを手動で割り付けることも可能。

データフレームの変数組み合わせの欠損行をNA(or指定文字列)で補完する
tidyr::complete(data, ..., fill = list())

省略不可な引数
data    処理対象のデータフレーム。
...    どの列を expand するかの指定。指定方法は expand(data, ...) と同じ。

オプションの引数
fill    名前付きリスト。名称で指定した各変数に対して、データが存在しない組み合わせ=欠損値を埋める値を指定。特段に指定しなければ NA になる。

グループに基づいて入れ子(階層化)された tibble を作る tidyr::nest 関数


nest(.data, ..., .key = deprecated())

省略不可な引数
.data    操作対象であるデータフレーム。

...    グループ化の基準に用いる変数列(複数可)。"" を付けない裸の変数名として列挙する。
Name-variable pairs of the form new_col = c(col1, col2, col3), that describe how you wish to nest existing columns into new columns. The right hand side can be any expression supported by tidyselect.

nest() で階層化された tibble を flatten する tidyr::unnest 関数


unnest( data, cols, ...,
        keep_empty=FALSE, ptype=NULL,names_sep=NULL, names_repair="check_unique",
        .drop=deprecated(), .id=deprecated(), .sep=deprecated(), .preserve=deprecated())

省略不可な引数
data    操作対象であるデータフレーム。

cols    階層化を解除する変数列。複数の変数の組み合わせで nest されていた場合、cols に特定のキーだけを記述すると、記述しなかった変数については階層状態を維持できる。ただし(何らかの加工後に)flatten された列において、各水準のデータ長が、本来あるべき行数に合致しないとヤバいことになる。

追加の引数
keep_empty    デフォルトでは、unchopping/unnesting するリストの要素ごとにつき、1つのデータ行が出力される。もしリストに空の要素があると、これに対応する行全体が出力において消されてしまう。keep_empty=TRUE を指定することで、欠損値を入れたものとして行を残しておくことができる。

ptype    出力される列のプロトタイプとして、既存のデータフレームを指定しておくと、unnest されて復帰するデータで対応部分を適宜書き換えたものを出力してくれる。

names_sep    デフォルトは NULL で、unnest() で上の階層に戻ってくる列たちの名前を、nest内に入っていたときの列名のままにする。文字列を指定すると、nest の名前と内部にあった列名を使って paste(nestの名前, 内部にあった列名, sep=name_sep) みたいな形で結合したものが、新たな列名として使われる。

names_repair    出力されるデータフレームの列名が有効かどうかをチェックし、修復する(デフォルトは、全く同じ列名が複数出てこないかのチェックだけ行う)。様々なオプションがあるが省略。

tibble 内の列のリスト要素であるベクトルを、 tibble のトップレベルの列へと展開する hoist/unnest_wider/unnest_longer 関数


レクタングリングは、幾重にも折りたたまれたリスト構造を、行や列からなる整然データに均すプログラミング技巧である。このために tidyr 1.0.0 で4つの関数が新規導入された。
unnest_wider() は(それ自体が tibble の列である)リストの要素であるベクトルを tibble のトップレベルの列へと展開する。
unnest_longer() はリストの要素であるベクトルを tibble のトップレベルの行へと展開する。
unnest_auto() はある種のヒューリスティックな方法で、ユーザーが unnest_longer() と unnest_wider() のどちらの操作を望んでいるか自動判断する。
hoist() は unnest_wider() に似ているが、リストの中に埋め込まれている列を明示的に選んで取り出し、tibble のトップレベルの列に配置できる。purrr::pluck() と同じ構文が使える。

hoist(.data, .col, ..., .remove=TRUE, .simplify=TRUE, .ptype=list())

unnest_longer(  data, col, values_to=NULL, indices_to=NULL, indices_include=NULL,
                names_repair="check_unique", simplify=TRUE, ptype=list())

unnest_wider(   data, col, names_sep=NULL, simplify=TRUE,
                names_repair="check_unique", ptype=list())

unnest_auto(data, col)


省略不可な引数
.data, data    データフレーム。hoist() のみ . がつく。

.col, col    取得したい要素が含まれている、data 中の列

...    .col の中で、新規列として取って来るべき要素を、 col_name="pluck_specification" の形で指定する。文字列ベクトルとして名前を指定してもよいし、整数ベクトルで場所を指定してもよいし、それらをリストにまとめてもよい。詳細は purrr::pluck() の指定方法に従う。

省略可能な引数
.remove    デフォルトは TRUE で、取り出されたコンポーネントは元の .col からは消去され、データフレーム内で1つのデータが重複して存在しないことが保証される。

.simplify    デフォルトは TRUE で、出力がリストとなり、全要素が単一の値しか含まない場合、これを atomic vector に単純化してくれる。

.ptype    Optionally, a named list of prototypes declaring the desired output type of each component.

values_to    Name of column to store vector values. Defaults to col.

indices_to    A string giving the name of column which will contain the inner names or position (if not named) of the values. Defaults to col with _id suffix

indices_include     Add an index column? Defaults to TRUE when col has inner names.

names_repair    Used to check that output data frame has valid names. Must be one of the following options:

    "minimal": no name repair or checks, beyond basic existence,
    "unique": make sure names are unique and not empty,
    "check_unique": (the default), no name repair, but check they are unique,
    "universal": make the names unique and syntactic
    a function: apply custom name repair.
    tidyr_legacy: use the name repair from tidyr 0.8.
    a formula: a purrr-style anonymous function (see rlang::as_function())

See vctrs::vec_as_names() for more details on these terms and the strategies used to enforce them.

simplify    If TRUE, will attempt to simplify lists of length-1 vectors to an atomic vector

ptype    Optionally, supply a data frame prototype for the output cols, overriding the default that will be guessed from the combination of individual values.

names_sep    If NULL, the default, the names of new columns will come directly from the inner data frame.

If a string, the names of the new columns will be formed by pasting together the outer column name with the inner names, separated by names_sep.

dplyr


複数の tidy なデータフレームの合意データを作る
dplyr::inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
dplyr::left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
dplyr::right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
dplyr::full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
dplyr::semi_join(x, y, by = NULL, copy = FALSE, ...)
dplyr::anti_join(x, y, by = NULL, copy = FALSE, ...)

省略不可な引数
x, y    結合したい2つのテーブル

オプションの引数
by    2つのテーブル間で共通の変数に対応する、列の名前を格納した文字列ベクトル。デフォルトは NULL であり、*_join() 関数はいわゆる "natural join"、すなわち2つのテーブルにおいて共通の列名が付いている変数全てを用いた、行のマッチングを実行する(須藤注:要するに、byに複数の列を指定したとき、値が完全一致する行同士を結合する)。byの中身を明示的に指定しなかった場合には、どの列を用いて join したかを通知するメッセージが出力される。
もしテーブル x と y で、同じ内容が異なる列名で保持されている場合は、たとえば by=c("a"="b") などとして名前付きベクトルで指定することで x.a と y.b をマッチさせることができる。

copy    もし x と y が異なるデータソース(これはRのインターフェースから SQL データベースに接続して使っている場合のことを指す)に基づいており、かつ copy=TRUE であるとき、 y の内容が x の属するデータベース(src)へコピーされる。これは潜在的に時間やメモリをバカ食いしうる操作であり、必要な場合だけ行うこと。

suffix    x, y に共通する名前の変数があったにもかかわらず by で指定されなかったとき、結合後のデータフレームにおける列名の重複を避けるために付ける接尾辞。長さ2の文字列ベクトルで指定。デフォルトでは出自に基づいて hoge -> hoge.x or hoge.y となる。

...    渡したい追加の引数があれば。

分かる人のための蛇足:もし x が dplyr::group_by() で層別された tibble である場合には、joining 最中には grouping は考慮されないが、最終的に生成されるデータには x に準拠した grouping が保持される。便利である。

####

結合タイプ

left_join()    列については「(xにある列)と(yにある列)の和集合」として全て保持される。行については、xの現存する行は全て保持される。byで指定した列の組み合わせが x⊃y であれば、対応する y 側データの無い行が発生することになり、そのようなセル(以下の例では plays の Mick)には NA が挿入される(須藤注: x⊂y であれば、y側にしか存在しない行のデータは挿入されない)。
もしも完全一致する行が複数存在する場合は、念のため (xのbyで指定されない列) と (yのbyで指定されない列) の全コンビネーションが作られる。

right_join()    left_join() の x と y の力関係を入れ替えたもの。(須藤注:だったら left_join() だけを、x と y を入れ替えて使えばいいじゃん?と思うかもしれない。まあ裸でこの関数を使う場合はその通り。だが実用的にはパイプライン中で、x を予め加工した後に %>% right_join(y) として流し込むことがあり、この用途は left_join() では代替できないのだ。)

inner_join()    列については「(xにある列)と(yにある列)の和集合」として全て保持される。行については(xのby指定列)と(yのby指定列)が完全一致する場合のみ、合併対象となる。もしも完全一致する行が複数存在する場合は、(xのbyで指定されない列)と(yのbyで指定されない列)の全コンビネーションが作られる。

semi_join()    xの行のうち、yにも共通列が存在するものだけを残す処理。yからのデータは保持されず、判定のみに用いられる。

# なお inner_join() と semi_join() の違いとして、仮に x のある行に対応する y の行が複数存在したとき、inner_join() では x の行が複製されるが、semi_join() ではそのようなことは起こらない。
# semi_join はデータの結合というよりも、x を y との共通項でスクリーニングする処理。

anti_join()    xの行のうち、yに対応行が存在しないものを抽出する処理。要するに semi_join() の y に関する余事象。

full_join()    x および y に存在するデータ行および列を全て保持しつつ合意データを作る。対応する行がもう片方にない列については、NA で補完する。

2つの(列の構成が等しい)データフレームからの、一致行ないし非一致行の絞り込み
(filtering join, set operations と呼ばれる機能)

dplyr::intersect(x, y): # 観測データの積集合、すなわち両方のデータフレームに存在する行のみを抽出する
dplyr::union(x, y): # 観測データの和集合、すなわち両データフレームを縦に結合してから、重複行を削除したものを出力する
dplyr::setdiff(x, y): # x にはあるが y にない行を返す。これのみ引数の順番が結果に影響する。

データフレームの行を条件で絞り込む
filter(.data, ...)

省略不可な引数
.data    絞り込み対象とする tbl 形式のテーブルデータ。正確に言うと filter() やそれに類する関数は S3 クラスの総称関数であり、与えた .data の型たとえば tbl_df() や dtplyr::tbl_dt() や dbplyr::tbl_dbi() などに応じて内部的に対応する関数がある(つまり外部データベースから持ってきたデータも処理対象にできるということ。気になる人は各自勉強)。

...    .data 内の変数において、絞り込み条件を与える論理述語(logical predicates)。複数条件は & で繋いで指定することができる(須藤注:ただし複数条件をコンマ , で繋いでも AND 条件になるし、その方が一般的だと思う。なお OR 条件は | でつなぐ)。とどのつまり .data の行数と同じ長さの真偽値ベクトルになればおk。最終的にTRUEの行が抽出対象となる。

なお ... 以下で指定した引数は、自動的に "" で囲まれてから、データフレームのコンテクスト内で評価される。ただし unquoting や splicing はサポートされている。これらの概念については vignette("programming") を参照。

たとえば、どの変数がどのスコープで定義されているかによって、 filter(df, x==y) は以下の4通りに解釈されうる。

df[df$x == df$y, ] # x, y がいずれも df の列名である。
df[df$x == y, ] # x は df の列名であるが、 y は df とは無関係のデータオブジェクトである。
df[x == df$y, ] # y は df の列名であるが、 x は df とは無関係のデータオブジェクトである。
df[x == y, ] # x, y ともに df とは無関係のベクトルオブジェクトであり、単に x 要素と y の同じ位置の要素が一致したか否かで判定される。

データフレームの列を条件で絞り込む。第2引数以下で指定されなかった列は削除される。
select(.data, ...)

データフレームの指定した列を改名する。非指定列も全て残される。
rename(.data, ...)

省略不可な引数
.data    絞り込み対象とする tbl 形式のテーブルデータ。filter() のときと同じく総称的である。

...    .data において列の絞り込み条件を与える1つ、ないしはコンマで区切られた複数の expression。変数の名前を、あたかもそれが何列目かを指定する数字(position)であるかのように扱うことができる。この数字が正であれば、その順番に対応する列が残される。数字にマイナスを付けると、対応する順番の列は削除される。

もし最初の expression が負だったら、select() 関数は自動的に全ての変数を残す設定に切り替わってから、続く expression の評価を開始する(須藤注:デフォルトでは、select() 関数は最初にどの変数も残さない状態から評価をスタートし、expression で明示的に指定された変数だけを拾って出力する)。

絞り込み条件を与える expression を named arguments、すなわち左辺に文字列が入るよう = で繋げば、指定した文字列で変数をリネームできる。

なお ... 以下で指定した引数は、自動的に "" で囲まれてから、列の名前が列のポジションを表すように、データフレームのコンテクスト内で評価される。ただし unquoting や splicing はサポートされている。これらの概念については vignette("programming") を参照。

arrange(.data, ...)
arrange(.data, ..., .by_group=FALSE) # データが grouped_df であったときに対応するメソッド

省略不可な引数
.data    並べ替え対象とする tbl 形式のテーブルデータ。S3 クラスの総称関数であり、与えた .data の型、たとえば tbl_df() や dtplyr::tbl_dt() や dbplyr::tbl_dbi() などに、それぞれ内部的に対応する関数がある。

...    並べ替え条件に用いたい列を、"" で囲わない列名として与える。複数の場合は、コンマで区切って与える。ここに挙げた優先順に、その変数について昇順になるようにデータ行が並べ替えられる(要するに2番目以降の条件は、タイが発生したときの判定基準としてのみ用いられる)。ただし desc() で囲った変数があれば、その変数だけは降順になるよう並べ替えられる。

.by_group    第一引数に grouped_df 型のデータを入れたときの追加引数。もしも TRUE であれば、最初に所与の grouping variable でソートしてから式評価を開始する。
デフォルトは FALSE。

tidyなデータフレームの行ごとにデータを操作する
mutate(.data, ...)

省略不可な引数
.data    絞り込み対象とするテーブル形式のデータ。

...    行いたい処理。複数あればコンマで区切る。
(新しい列名)=(ここに処理内容) とすれば、.data に新しい列を追加できる。
(もともとあった列名)=(ここに処理内容) とすれば、元々 .data にあった列の内容を書き換えられる。
(もともとあった列名)=NULL としてヌルを代入すれば、.data から列を削除する操作になる。

データフレーム中の条件指定した列を一括で mutate する
mutate_all(.tbl, .funs, ...)
mutate_if(.tbl, .predicate, .funs, ...)
mutate_at(.tbl, .vars, .funs, ..., .cols = NULL)

全ての関数で省略不可な引数
.tbl    操作対象の列を含むテーブル形式のデータ。

.funs    対象の列に対して行う操作。リストにまとめられた関数呼び出し(funs() 関数で生成される)として与えるか、関数の名前を文字列ベクトルとして列挙する。もしくは単純に1つだけ関数を与える。
(以下直訳)複数の formula を裸で与えると rlang::as_function() へ渡され、purrr スタイルのラムダ式になる。こうして生成されるラムダ式においては hybrid evaluation from happening ができないため、ラムダ式で処理内容を与えるよりも mean() 等の関数を直接与えるほうが、計算効率は良い。

...    .funs の関数呼び出し時に与える追加の引数がもしあれば。いずれも一度しか評価されない。tidy-dots サポートあり。何のことやらという人は以下を見よ。
https://www.rdocumentation.org/packages/rlang/versions/0.2.1/topics/tidy-dots

関数特異的な引数

.predicate    mutate_if() 関数において、対象列を絞り込むための選択基準を与える。叙述関数(predicate function: bool型の評価結果を返す関数のこと)、もしくはどの列を選択する/しないをダイレクトに記述した logical vector。mutate_if() 関数においては、この .predicate が TRUE であるところの変数が処理の対象に選ばれる。
この引数は rlang::as_function() に渡されるため、quosure スタイルのラムダ式や、関数の名前を "" で括って文字列形式で与えるということも可能である。

.vars    mutate_at() 関数において、対象列を絞り込むための選択基準を与える。vars() 関数によって生成されるリスト、もしくは列の名を並べた文字列ベクトル、さらには何番目の列を対象とするかを示す数値ベクトルとして与えることもできる。

.cols    旧いバージョンの mutate_at() では .vars の替わりに .cols と呼んでいた。つまり .cols=c("hoge", "huga") などとしても対象列を指定できるが、dplyr の文法の統一性を図るため非推奨である。

処理対象列の処理後の姿だけをデータフレーム中に残しつつ mutate する
transmute(.data, ...)
transmute_all(.tbl, .funs, ...)
transmute_if(.tbl, .predicate, .funs, ...)
transmute_at(.tbl, .vars, .funs, ..., .cols = NULL)

データフレームの列(変数)に着目して水準ごとにグループ化する dplyr::group_by 関数

公式解説はこちら


テーブル形式のデータを、変数列に着目して水準ごとにグループ化した grouped tbl にする。
ungroup() でグループを解除する。

group_by(.data, ..., add = FALSE, .drop = group_by_drop_default(.data))
ungroup(x, ...)

省略不可な引数
.data, x    操作対象であるテーブル形式のデータ。

...    グループ化の基準に用いる変数列(複数可)。"" を付けない裸の変数名として列挙する。

オプションの引数
add    FALSE(デフォルトはこちら)のとき、すでに group_by() されている tibble に再び group_by() を適用すると、最後の group_by() に指定した変数だけがグループ化の基準として用いられる。add=TRUE とすると、既存のグループに基準を追加できる。

.drop    もし TRUE だと、空のグループの情報は保持されない。デフォルトは group_by_drop_default() の指定に従う。

テーブルに含まれる変数列に要約処理を施し、スカラー値を返す dplyr::summarise 関数

公式解説はこちら


summarise(.data, ...)
summarize(.data, ...) # 綴りはどちらでも動く

既存の tbl に含まれる変数列に要約処理を施し、1 つ以上のスカラー値を返す。group_by() でグループ化されている tbl に対しては、グループごとに 1 つの値を返す。グループ化されていなければ、出力は 1 行になる。

省略不可な引数
.data tbl 形式のオブジェクト。summarise 自体は S3クラスの総称的な関数であり、 tbl_df() や dtplyr::tbl_dt() や dbplyr::tbl_dbi() といった関数を内部的に呼び出している(須藤注:データ型に応じたこれらの関数をユーザーが決め打ちで呼ぶことも出来るが、ふつうは深く考えずに使っている)。

... 要約処理を好きなだけ、 処理結果を格納する列名=処理関数, というペア(Name-value pairs)の形で連ねて書ける。
    右辺である value はたとえば min(x) や n() や sum(is.na(y)) のように、単一の値を返す expression であるべきである。
    処理部分に含まれる引数(須藤注:典型的には min(x) の x みたいに、処理対象列を指定する)については、自動的に "" を付けてから、評価対象のデータフレームの中で対応する列を探してくる。 unquoting や splicing にも対応している。

グループ化された tibble に反復処理を施すための purrr スタイルの関数 dplyr::group_map


グループ化された tibble に反復処理を施すための purrr スタイルの関数

group_map(.tbl, .f, ..., keep = FALSE)
group_modify(.tbl, .f, ..., keep = FALSE)
group_walk(.tbl, .f, ...)

省略不可の引数
.tbl    グループ化された tibble

.f    各グループに適用すべき関数ないしフォーミュラ。データフレームを返さねばならない(須藤注:このルールが厳格なのは group_modify)。関数であればそのまま評価される。少なくとも2つの仮引数を持つべきである。

たとえば ~head(.x) 等のフォーミュラであれば、関数に変換されてから評価される。フォーミュラ内では . ないし .x として、所与のグループに属する .tbl のデータ行にアクセスできる。.y で key、すなわちグループを定義するために使われているグルーピング変数を中身に持つ 1 x 1 サイズの tibble にアクセスできる。

...    .f に渡される追加引数。
keep    グルーピングに用いた変数を .x 内に残したいか。デフォルトは FALSE

値
group_modify() はグループ化された tibble を返す。 .f は厳密にデータフレームを返す処理でなければならない。
group_map() は、各グループに対し .f を適用した結果をリストにまとめて返す。
group_walk() は .f を副作用として実行し、(invisible な)返り値は .tbl そのままである。パイプライン途中の状態を plot したり、環境を書き換えたい場合などに使えるらしい。

テーブルから単一の値を引き出す dplyr::pull 関数


https://dplyr.tidyverse.org/reference/pull.html

pull() 関数はローカル環境上のデータフレームから、 [[]] に似た形で要素を引き出す。リモートにある複数の data table が対象の場合は、インデックス前にそれらのテーブルを統合する。

pull(.data, var = -1)

引数
.data    データが入ったテーブル構造

var    以下のいずれかの形で指定される変数
1. 変数名の文字列
2. インデックスの左(冒頭)からの位置を示す正の整数
3. インデックスの右(末尾)からの位置を示す負の整数

デフォルトは -1 で、最後の列を取得する(ユーザーが作った最新のデータは右端列にあることが多いので)。
引数 var は expression として関数に渡され、quasiquotation をサポートしているので、列名や位置には "" を付けても付けなくてもいい。

purrr

入力の各要素に関数を適用して変形を行い、入力と同じ長さのデータを出力する purrr::map 関数ファミリー


map() 関数は常にリストを返す。入力と同じデータ型を必ず返したければ、modify() ファミリーの関数を検討せよ。
map_lgl(), map_int(), map_dbl(), および map_chr() は、それぞれの名前に示されたデータ型に変換した(出来ないとエラーになる)ベクトルを返す。
map_dfr() および map_dfc() はデータフレームを返す。なお _dfr は row-binding を、 _dfc は column-binding を行う。

処理内容である .f の返り値は、入力である .x の各要素について長さ 1 にならねばならない。もしも .f が extractor function shortcut を用いるならば、それに対応する入力値の変数列が存在しないか、値が空であるときに充てがう値を .default として指定できる(詳細は as_mapper() を見よ)。
walks() は .f を副作用として呼び出し、関数自体の出力は、入力である .x をそのまま返す。

map(.x, .f, ...)
map_lgl(.x, .f, ...)
map_chr(.x, .f, ...)
map_int(.x, .f, ...)
map_dbl(.x, .f, ...)
map_raw(.x, .f, ...)
map_dfr(.x, .f, ..., .id = NULL)
map_dfc(.x, .f, ...)
walk(.x, .f, ...)

省略不可な引数
.x    リストもしくはベクトル(atomic vector)。処理対象のデータ。

.f    関数、式、ないしベクトル(atomic でなくてもよい)
関数であればそのまま使われる。
式であれば(例: ~.x+2)関数に変換される。
それらの処理を書く中で、引数自体に言及する方法は3つある。これらの構文を用いると無名関数をコンパクトに書ける。
1) 引数が1つしか無い関数であれば . で表す。
2) 2つの引数を持つ関数であれば .x と .y で表す。
3) 3つ以上の引数を持つ関数であれば、 ..1, ..2, ..3, などとして表す。

.f の中身を文字列ベクトル、数値ベクトル、ないしリストとして与えると、extractor function に変換される。文字列ベクトルは name によってインデックス化され、数値ベクトルは場所によってインデックス化される。場所によるインデックスと名前によるインデックスを階層依存で使い分けたい場合はリストを使う。あるコンポーネントが存在しない場合は、 .default に指定した値を入れて返す。

...    mapされる関数に指定したい、追加の引数。

.id    map_dfr() だけに存在するオプションの引数で、*_dfr の関数だけに適用される。デフォルトは NULL だが、文字列を指定した場合、その名前で出力に新たな変数(列)が作られ、入力におけるインデックスの値がそこに格納される。

値
map() 関数は常に .x と同じ要素数のリストを返す。
map_lgl(), map_int(), map_dbl(), および map_chr() は、それぞれの名前に示されたデータ型のベクトルを返す。
map_df(), map_dfr(), および map_dfc() はデータフレームを返す。

入力データ .x の要素に名前がついていれば、その情報は可能な限り出力データにも残される。

なお、 .f の出力するデータが真偽値で書ける(0, 1 の2値しか出ない)場合はデータ型が logical になり、整数しか出なければ integer に、実数のみ含むならば double に、数で表せない文字情報まで含む場合は character に、適宜変換される(ただし一方通行であり、元々 "0", "1" だったデータを勝手に 0, 1 へ変換するようなことはない)。

walks() は入力である .x をそのまま返す。パイプの途中でデータ .x をそのまま保持しつつ、外部に何らかの干渉を行いたい場合に便利。

複数の引数を取りながらグループごとに複雑な処理を行う map2, pmap 系関数


複数の入力について同時に map する。

以下の関数は map() の変種であり、複数の引数について同時にイテレートできる。ただし parallel といっても、計算がマルチコア化されているわけではない。map2() と walk2() は2つの引数を同時に変化させられる。操作対象のデータを含むリストから、任意の数の引数を同時に取ってこれるのが pmap() と pwalk() である。

特殊だが重要なケースとしてデータフレームがある。データフレームに対して pmap を適用する場合、 処理内容である .f は各行について適用される。 map_dfr() と pmap_dfr() は row-binding して作られたデータフレームを返す一方、 map2_dfc() および pmap_dfc は column-binding して作られたデータフレームを返す。

map2(.x, .y, .f, ...)
map2_lgl(.x, .y, .f, ...)
map2_int(.x, .y, .f, ...)
map2_dbl(.x, .y, .f, ...)
map2_chr(.x, .y, .f, ...)
map2_raw(.x, .y, .f, ...)
map2_dfr(.x, .y, .f, ..., .id = NULL)
map2_dfc(.x, .y, .f, ...)

walk2(.x, .y, .f, ...)

pmap(.l, .f, ...)
pmap_lgl(.l, .f, ...)
pmap_int(.l, .f, ...)
pmap_dbl(.l, .f, ...)
pmap_chr(.l, .f, ...)
pmap_raw(.l, .f, ...)
pmap_dfr(.l, .f, ..., .id = NULL)
pmap_dfc(.l, .f, ...)
pwalk(.l, .f, ...)


省略不可な引数
.x, .y    等しい長さのベクトル。いずれかが長さ1ならばリサイクルされる。

.f    関数、式、ないしベクトル(atomic でなくてもよい)
関数であればそのまま使われる。
式であれば(例: ~.x+2)関数に変換される。
それらの処理を書く中で、引数自体に言及する方法は3つある。
1) 引数が1つしか無い関数であれば . で表す。
2) 2つの引数を持つ関数であれば .x と .y で表す。
3) 3つ以上の引数を持つ関数であれば、 ..1, ..2, ..3, などとして表す。

.f の中身を文字列ベクトル、数値ベクトル、ないしリストとして与えると、extractor function に変換される。文字列ベクトルは name によってインデックス化され、数値ベクトルは場所によってインデックス化される。場所によるインデックスと名前によるインデックスを階層依存で使い分けたい場合はリストを使う。あるコンポーネントが存在しない場合は、 .default に指定した値を入れて返す。

...    mapされる関数に指定したい、追加の引数。

.id    オプションの引数で、*_dfr の関数だけに適用される。デフォルトは NULL だが、文字列を指定した場合、その名前で出力に新たな変数(列)が作られ、入力におけるインデックスの値がそこに格納される。

.l    .f の関数に渡したい引数たちを、ベクトルを束ねたリストとして与える。しばしばデータフレームの形になる。.l のリスト要素数(データフレームならば列数)が、 .f を呼び出すときの引数の長さを決定する。リスト要素に名前が付いていれば、処理中でその名前で参照できる。

値
返る値は、関数の接尾辞に応じて atomic vector であったり list であったり、データフレームであったりする。ベクトルとリストの各要素については、 .x もしくは .l の最初の要素が名前付きであれば、その名前が引き継がれる。
入力が全て長さ 0 であれば出力も長さ 0 になる。入力のいずれかの要素が長さ 1 であれば、最長の要素に合わせて値がリサイクルされる。

ベクトルないし環境から単一の要素を取ってくる pluck/chuck 関数


https://purrr.tidyverse.org/reference/pluck.html

pluck()(摘み取る)および chuck()(摘み出す)はデータ構造の深いところへ、インデックスを用いて柔軟にアクセスするための、[[]] の一般化された機能を提供する。関数としての機能の違いは、前者は指定された要素が存在しない場合 NULL (ないし .default に与えた値)を返すが、後者はエラーを返すことである。

pluck(.x, ..., .default = NULL)
chuck(.x, ...)
pluck(.x, ...) <- value

省略不可な引数
.x, x    ベクトルもしくは環境

...    .x で指定したオブジェクト内のインデックスとして、取り出したいデータの位置を指定する、アクセサー accessors からなるリスト。整数で(ベクトル内の)データの位置を指定することも出来るし、文字列 "" で名前を指定してもいいし、 accessor function を書いてもいい(ただし結果的に位置や名前でインデックスを返すものに限る)。もしインデックス対象のオブジェクトが S4 クラスだった場合、名前でアクセスすると対応する slot が返る。
これらの ... のドットは tidy dots feature をサポートしている。特に accessor がリスト内に格納されている場合、 !!! を用いて splice することが可能。

(須藤注: tidy-dots も初出の概念だが、以下に解説がある。)
https://rlang.r-lib.org/reference/tidy-dots.html

.default    上で指定したターゲットが空ないし存在しなかった場合に返す値(上述どおり pluck の場合の対応。chuck だとエラーになる)。

value    pluck の構文を用いて、 .x の指定箇所に値を代入することも出来る。

Details
pluck を用いることで、[[]] や $ で指定するよりも可読性の高いコードになる。ただし、 $ と違って部分一致はできない。例えば mtcars$di と書くと、他に di で始まる変数列がないので mtcars$disp のことだと判断してくれるが、pluck(mtcars, "di") は NULL になる。

演算子

パイプ演算子 %>% のこと

%>% は「パイプ演算子」。現在は tidyverse に統合済みの magrittr というパッケージにて提供されている(なおパイプ自体はR言語に限った機能ではない)。簡単にいうと、パイプ演算子の左辺にあるデータを、右辺の関数の第一引数に代入して実行しませい、という指示を出す。従って右辺の関数は第二引数以降を括弧内に書くことになる。


T> は Tee演算子。正確には tidyverse::magrittr に属する。

library(tidyverse) の一括ロードには今のところ含まれていない。

Pipe a value forward into a function- or call expression and return the original value instead of the result. This is useful when an expression is used for its side-effect, say plotting or printing. The tee operator works like %>%, except the return value is lhs itself, and not the result of rhs function/expression.

普通のパイプ %>% だけで繋いでいる間は画面に何も出ない。パイプ処理も繋ぎつつ、途中で副作用として標準出力に出したい場合は、 %T>% で繋ぐ。
lhs %T>% rhs

ただし
lhs    A value or the magrittr placeholder.
rhs    A function call using the magrittr semantics.

では、今回はここまで。


# いったん、ここまでのデータを保存する。
today <- "180209"
save( list=ls(), file=paste("tidy", today, "dat", sep=".") ) # ワークスペースをバイナリ形式で

# よみこみ
today <- "180209"
load( file=paste("tidy", today, "dat", sep=".") )