# API設計書

## 概要

本ドキュメントはdplyrパッケージ（バージョン1.2.0.9000）のプログラミングAPIを設計書として文書化したものです。dplyrはRにおけるデータフレーム操作のための文法を提供するパッケージであり、データの変換、フィルタリング、集計などの操作を効率的に行うための関数群を提供します。

本ドキュメントはHTTP APIではなく、R関数のインターフェースを「API」として文書化しています。

## 共通仕様

### パッケージ読み込み

```r
library(dplyr)
```

### データマスキング

dplyrの多くの関数は「データマスキング」を使用しており、データフレームの列名を直接変数として参照できます。

```r
# 列名を直接参照可能
df |> filter(x > 5)  # df$x > 5 と同等
```

### tidy-select

列の選択には「tidy-select」構文が使用できます。

- `starts_with("prefix")`: 指定のプレフィックスで始まる列
- `ends_with("suffix")`: 指定のサフィックスで終わる列
- `contains("string")`: 指定の文字列を含む列
- `where(is.numeric)`: 条件を満たす列
- `everything()`: 全ての列

### 共通エラー

| エラー種別 | 説明 |
| --- | --- |
| Column not found | 指定された列がデータフレームに存在しない |
| Type mismatch | 型の不一致（例：数値列に文字列操作を適用） |
| Size mismatch | サイズの不一致（例：異なる長さのベクトルを結合） |
| Group error | グループ操作に関するエラー |

## API一覧

| カテゴリ | 関数名 | 説明 |
| --- | --- | --- |
| 行操作 | filter() | 条件に基づいて行をフィルタリング |
| 行操作 | filter_out() | 条件に基づいて行を除外 |
| 行操作 | slice() | 位置に基づいて行を選択 |
| 行操作 | slice_head() | 先頭の行を選択 |
| 行操作 | slice_tail() | 末尾の行を選択 |
| 行操作 | slice_min() | 最小値を持つ行を選択 |
| 行操作 | slice_max() | 最大値を持つ行を選択 |
| 行操作 | slice_sample() | ランダムに行を選択 |
| 行操作 | distinct() | 重複行を除去 |
| 行操作 | arrange() | 行を並べ替え |
| 列操作 | select() | 列を選択 |
| 列操作 | rename() | 列名を変更 |
| 列操作 | rename_with() | 関数で列名を変更 |
| 列操作 | relocate() | 列の位置を変更 |
| 列操作 | pull() | 単一列をベクトルとして抽出 |
| データ変換 | mutate() | 列の作成・変更・削除 |
| データ変換 | transmute() | 列を作成し他の列を削除 |
| 集計 | summarise() / summarize() | データを集計 |
| 集計 | reframe() | 複数行を返す集計 |
| 集計 | count() | グループごとの行数をカウント |
| 集計 | tally() | 行数をカウント |
| 集計 | add_count() | カウント列を追加 |
| 集計 | add_tally() | 行数列を追加 |
| グループ操作 | group_by() | グループ化 |
| グループ操作 | ungroup() | グループ解除 |
| グループ操作 | rowwise() | 行単位のグループ化 |
| 結合 | inner_join() | 内部結合 |
| 結合 | left_join() | 左外部結合 |
| 結合 | right_join() | 右外部結合 |
| 結合 | full_join() | 完全外部結合 |
| 結合 | semi_join() | 半結合（フィルタリング結合） |
| 結合 | anti_join() | 反結合（フィルタリング結合） |
| 結合 | nest_join() | ネスト結合 |
| 結合 | cross_join() | クロス結合 |
| 結合 | bind_rows() | 行方向の結合 |
| 結合 | bind_cols() | 列方向の結合 |

## 各API関数定義

### 行操作

#### 1 filter()

条件に基づいて行を保持します。NAは`FALSE`として扱われ、除外されます。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `filter(.data, ..., .by = NULL, .preserve = FALSE)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame, grouped_df, rowwise_df |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | 論理値を返すフィルタ条件式（data-masking） |
| .by | tidy-select | - | NULL | 一時的なグループ化変数 |
| .preserve | logical | - | FALSE | グループ構造を保持するか |

**戻り値**

入力と同じ型のオブジェクト。行は入力のサブセットで、同じ順序で出現。列は変更されない。

**使用例**

```r
# 単一条件でフィルタリング
filter(starwars, species == "Human")

# 複数条件（AND）
filter(starwars, hair_color == "none", eye_color == "black")

# OR条件
filter(starwars, hair_color == "none" | eye_color == "black")

# グループごとのフィルタリング
starwars |> filter(mass > mean(mass, na.rm = TRUE), .by = gender)
```

---

#### 2 filter_out()

条件に基づいて行を除外します。`filter()`の逆操作で、NAは除外されません。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `filter_out(.data, ..., .by = NULL, .preserve = FALSE)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | 除外条件式（data-masking） |
| .by | tidy-select | - | NULL | 一時的なグループ化変数 |
| .preserve | logical | - | FALSE | グループ構造を保持するか |

**戻り値**

入力と同じ型のオブジェクト。条件に一致しない行とNA行を保持。

**使用例**

```r
# blondの髪色を除外（NAは保持）
starwars |> filter_out(hair_color == "blond")
```

---

#### 3 slice()

位置（整数インデックス）に基づいて行を選択します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `slice(.data, ..., .by = NULL, .preserve = FALSE)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame, grouped_df |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | integer | ○ | - | 行インデックス（正：保持、負：除外） |
| .by | tidy-select | - | NULL | 一時的なグループ化変数 |
| .preserve | logical | - | FALSE | グループ構造を保持するか |

**戻り値**

入力と同じ型のオブジェクト。指定した位置の行を含む。

**使用例**

```r
# 最初の行
mtcars |> slice(1L)

# 最後の行
mtcars |> slice(n())

# 5行目から最後まで
mtcars |> slice(5:n())

# 最初の4行を除外
slice(mtcars, -(1:4))
```

---

#### 4 slice_head() / slice_tail()

先頭または末尾から指定した数の行を選択します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `slice_head(.data, ..., n, prop, by = NULL)` |
| ジェネリック関数 | はい |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| n | integer | - | 1 | 選択する行数 |
| prop | numeric | - | - | 選択する割合（0-1） |
| by | tidy-select | - | NULL | 一時的なグループ化変数 |

**使用例**

```r
# 先頭5行
mtcars |> slice_head(n = 5)

# 末尾5行
mtcars |> slice_tail(n = 5)

# 先頭10%
mtcars |> slice_head(prop = 0.1)
```

---

#### 5 slice_min() / slice_max()

指定した変数の最小値または最大値を持つ行を選択します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `slice_min(.data, order_by, ..., n, prop, by = NULL, with_ties = TRUE, na_rm = FALSE)` |
| ジェネリック関数 | はい |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| order_by | expression | ○ | - | 順序付けに使用する変数 |
| n | integer | - | 1 | 選択する行数 |
| prop | numeric | - | - | 選択する割合 |
| by | tidy-select | - | NULL | 一時的なグループ化変数 |
| with_ties | logical | - | TRUE | 同値を含めるか |
| na_rm | logical | - | FALSE | NAを除外するか |

**使用例**

```r
# mpgが最小の5行
mtcars |> slice_min(mpg, n = 5)

# mpgが最大の5行
mtcars |> slice_max(mpg, n = 5)

# 同値を除外
mtcars |> slice_min(cyl, n = 1, with_ties = FALSE)
```

---

#### 6 slice_sample()

ランダムに行を選択します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `slice_sample(.data, ..., n, prop, by = NULL, weight_by = NULL, replace = FALSE)` |
| ジェネリック関数 | はい |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| n | integer | - | 1 | 選択する行数 |
| prop | numeric | - | - | 選択する割合 |
| by | tidy-select | - | NULL | 一時的なグループ化変数 |
| weight_by | expression | - | NULL | サンプリング重み |
| replace | logical | - | FALSE | 復元抽出を行うか |

**使用例**

```r
# ランダムに5行選択
mtcars |> slice_sample(n = 5)

# 復元抽出
mtcars |> slice_sample(n = 5, replace = TRUE)

# 重み付きサンプリング
mtcars |> slice_sample(weight_by = wt, n = 5)

# シャッフル
mtcars |> slice_sample(prop = 1)
```

---

#### 7 distinct()

重複行を除去し、ユニークな行のみを保持します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `distinct(.data, ..., .keep_all = FALSE)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | - | - | ユニーク判定に使用する変数（省略時は全列） |
| .keep_all | logical | - | FALSE | 全ての列を保持するか |

**戻り値**

入力と同じ型のオブジェクト。行は入力のサブセットで、最初に出現した行のみを保持。

**使用例**

```r
# 全ての列でユニーク
df |> distinct()

# 特定の列でユニーク
df |> distinct(x, y)

# 全列を保持
df |> distinct(x, .keep_all = TRUE)
```

---

#### 8 arrange()

指定した列の値に基づいて行を並べ替えます。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `arrange(.data, ..., .by_group = FALSE)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | 並べ替えに使用する変数（data-masking） |
| .by_group | logical | - | FALSE | グループ変数で最初に並べ替えるか |
| .locale | character | - | NULL | ソートに使用するロケール |

**戻り値**

入力と同じ型のオブジェクト。全ての行が含まれるが、順序が変更される。

**使用例**

```r
# 昇順
arrange(mtcars, cyl, disp)

# 降順
arrange(mtcars, desc(disp))

# グループ優先
by_cyl |> arrange(desc(wt), .by_group = TRUE)
```

---

### 列操作

#### 9 select()

列を選択します。列の並べ替えやリネームも可能です。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `select(.data, ...)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | tidy-select | ○ | - | 選択する列 |

**戻り値**

入力と同じ型のオブジェクト。出力列は入力のサブセット。

**使用例**

```r
# 列名で選択
select(iris, Sepal.Length, Sepal.Width)

# 範囲で選択
select(iris, Sepal.Length:Petal.Length)

# ヘルパー関数で選択
select(iris, starts_with("Sepal"))
select(iris, where(is.numeric))

# リネーム
select(iris, sepal_length = Sepal.Length)
```

---

#### 10 rename()

列名を変更します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `rename(.data, ...)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | tidy-select | ○ | - | new_name = old_name 形式の指定 |

**戻り値**

入力と同じ型のオブジェクト。列名のみ変更。

**使用例**

```r
rename(iris, petal_length = Petal.Length)

# 名前付きベクトルで複数列をリネーム
lookup <- c(pl = "Petal.Length", sl = "Sepal.Length")
rename(iris, all_of(lookup))
```

---

#### 11 rename_with()

関数を使用して列名を変更します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `rename_with(.data, .fn, .cols = everything(), ...)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| .fn | function | ○ | - | 列名変換関数 |
| .cols | tidy-select | - | everything() | 対象列 |
| ... | - | - | - | .fnに渡す追加引数 |

**使用例**

```r
rename_with(iris, toupper)
rename_with(iris, toupper, starts_with("Petal"))
rename_with(iris, ~ tolower(gsub(".", "_", .x, fixed = TRUE)))
```

---

#### 12 relocate()

列の位置を変更します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `relocate(.data, ..., .before = NULL, .after = NULL)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | tidy-select | ○ | - | 移動する列 |
| .before | tidy-select | - | NULL | 移動先（この列の前） |
| .after | tidy-select | - | NULL | 移動先（この列の後） |

**使用例**

```r
df |> relocate(f)                    # fを先頭に
df |> relocate(a, .after = c)        # aをcの後ろに
df |> relocate(f, .before = b)       # fをbの前に
df |> relocate(where(is.character))  # 文字列列を先頭に
```

---

#### 13 pull()

単一の列をベクトルとして抽出します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `pull(.data, var = -1, name = NULL, ...)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| var | tidy-select | - | -1 | 抽出する列（負値は末尾から） |
| name | tidy-select | - | NULL | 名前付きベクトルにする場合の名前列 |

**戻り値**

.dataと同じサイズのベクトル。

**使用例**

```r
mtcars |> pull(-1)      # 最後の列
mtcars |> pull(1)       # 最初の列
mtcars |> pull(cyl)     # 列名で指定
starwars |> pull(height, name)  # 名前付きベクトル
```

---

### データ変換

#### 14 mutate()

列の作成、変更、削除を行います。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `mutate(.data, ..., .by = NULL, .keep = "all", .before = NULL, .after = NULL)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame, grouped_df |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | 名前 = 値のペア（data-masking） |
| .by | tidy-select | - | NULL | 一時的なグループ化変数 |
| .keep | character | - | "all" | 保持する列："all", "used", "unused", "none" |
| .before | tidy-select | - | NULL | 新列の挿入位置（この列の前） |
| .after | tidy-select | - | NULL | 新列の挿入位置（この列の後） |

**戻り値**

入力と同じ型のオブジェクト。行数は変わらない。

**使用例**

```r
# 新しい列を作成
starwars |> mutate(mass2 = mass * 2)

# 列を削除
starwars |> mutate(mass = NULL)

# 列を変更
starwars |> mutate(height = height * 0.0328084)

# 複数列に関数を適用
starwars |> mutate(across(!name, as.factor))

# 新列の位置を指定
df |> mutate(z = x + y, .before = 1)
```

---

### 集計

#### 15 summarise() / summarize()

データを集計し、各グループを1行に要約します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `summarise(.data, ..., .by = NULL, .groups = NULL)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame, grouped_df, rowwise_df |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | 名前 = 集計関数のペア（data-masking） |
| .by | tidy-select | - | NULL | 一時的なグループ化変数 |
| .groups | character | - | NULL | 結果のグループ構造："drop_last", "drop", "keep", "rowwise" |

**戻り値**

通常、入力と同じ型のオブジェクト。グループキーと集計結果の列を含む。

**使用例**

```r
# 単純な集計
mtcars |> summarise(mean = mean(disp), n = n())

# グループ集計
mtcars |> group_by(cyl) |> summarise(mean = mean(disp), n = n())

# .byで一時グループ化
mtcars |> summarise(mean = mean(disp), .by = cyl)
```

---

#### 16 count() / tally()

グループごとの行数をカウントします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `count(x, ..., wt = NULL, sort = FALSE, name = NULL)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| x | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | - | - | グループ化変数（data-masking） |
| wt | expression | - | NULL | 重み変数 |
| sort | logical | - | FALSE | 降順でソートするか |
| name | character | - | NULL | カウント列の名前（デフォルト: "n"） |
| .drop | logical | - | TRUE | 空のファクターレベルを除外するか |

**使用例**

```r
starwars |> count(species)
starwars |> count(species, sort = TRUE)
starwars |> count(sex, gender, sort = TRUE)
df |> count(gender, wt = runs)  # 重み付きカウント
```

---

### グループ操作

#### 17 group_by()

データフレームをグループ化します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `group_by(.data, ..., .add = FALSE, .drop = group_by_drop_default(.data))` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| .data | data.frame | ○ | - | 対象のデータフレーム |
| ... | expressions | ○ | - | グループ化変数（data-masking） |
| .add | logical | - | FALSE | 既存グループに追加するか |
| .drop | logical | - | TRUE | 空のファクターレベルを除外するか |

**戻り値**

`grouped_df`クラスのデータフレーム。

**使用例**

```r
by_cyl <- mtcars |> group_by(cyl)

# グループごとの操作
by_cyl |> summarise(disp = mean(disp))
by_cyl |> filter(disp == max(disp))

# グループ追加
by_cyl |> group_by(vs, am, .add = TRUE)
```

---

#### 18 ungroup()

グループ化を解除します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `ungroup(x, ...)` |
| ジェネリック関数 | はい |
| 対応クラス | grouped_df, rowwise_df, data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| x | tbl | ○ | - | 対象のデータフレーム |
| ... | tidy-select | - | - | 解除するグループ変数 |

**使用例**

```r
by_cyl |> ungroup()  # 全グループ解除
by_cyl_vs |> ungroup(vs)  # vsグループのみ解除
```

---

### 結合

#### 19 inner_join()

両方のデータフレームに存在するキーのみを保持する内部結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ..., keep = NULL)` |
| ジェネリック関数 | はい |
| 対応クラス | data.frame |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| x, y | data.frame | ○ | - | 結合するデータフレーム |
| by | join_by/character | - | NULL | 結合キー（NULLで自然結合） |
| copy | logical | - | FALSE | yをxのソースにコピーするか |
| suffix | character(2) | - | c(".x", ".y") | 重複列名のサフィックス |
| keep | logical | - | NULL | 両方のキーを保持するか |
| na_matches | character | - | "na" | NAの比較方法："na"または"never" |
| multiple | character | - | "all" | 複数マッチの処理 |
| unmatched | character | - | "drop" | マッチしない行の処理 |
| relationship | character | - | NULL | 期待する関係性 |

**使用例**

```r
band_members |> inner_join(band_instruments)
band_members |> inner_join(band_instruments, by = join_by(name))
```

---

#### 20 left_join()

xの全ての行を保持する左外部結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ..., keep = NULL)` |
| ジェネリック関数 | はい |

**使用例**

```r
band_members |> left_join(band_instruments)
```

---

#### 21 right_join()

yの全ての行を保持する右外部結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ..., keep = NULL)` |
| ジェネリック関数 | はい |

**使用例**

```r
band_members |> right_join(band_instruments)
```

---

#### 22 full_join()

xとyの全ての行を保持する完全外部結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ..., keep = NULL)` |
| ジェネリック関数 | はい |

**使用例**

```r
band_members |> full_join(band_instruments)

# 異なるキー名での結合
band_members |> full_join(band_instruments2, by = join_by(name == artist))
```

---

#### 23 semi_join()

yにマッチするxの行を返すフィルタリング結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `semi_join(x, y, by = NULL, copy = FALSE, ...)` |
| ジェネリック関数 | はい |

**戻り値**

xと同じ型のオブジェクト。行はxのサブセット、列は変更なし。

**使用例**

```r
band_members |> semi_join(band_instruments)
```

---

#### 24 anti_join()

yにマッチしないxの行を返すフィルタリング結合。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `anti_join(x, y, by = NULL, copy = FALSE, ...)` |
| ジェネリック関数 | はい |

**使用例**

```r
band_members |> anti_join(band_instruments)
```

---

#### 25 bind_rows()

複数のデータフレームを行方向に結合します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `bind_rows(..., .id = NULL)` |
| ジェネリック関数 | いいえ |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| ... | data.frame | ○ | - | 結合するデータフレーム |
| .id | character | - | NULL | 元データの識別子列名 |

**戻り値**

最初の要素と同じ型のデータフレーム。

**使用例**

```r
df1 <- tibble(x = 1:2, y = letters[1:2])
df2 <- tibble(x = 4:5, z = 1:2)

bind_rows(df1, df2)
bind_rows(list(df1, df2))
bind_rows(list(a = df1, b = df2), .id = "id")
```

---

#### 26 bind_cols()

複数のデータフレームを列方向に結合します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `bind_cols(..., .name_repair = c("unique", "universal", "check_unique", "minimal"))` |
| ジェネリック関数 | いいえ |

**引数**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| ... | data.frame | ○ | - | 結合するデータフレーム |
| .name_repair | character | - | "unique" | 列名の修復方法 |

**使用例**

```r
df1 <- tibble(x = 1:3)
df2 <- tibble(y = 3:1)
bind_cols(df1, df2)
```

---

## 備考

### パイプ演算子

dplyrは`%>%`（magrittrパイプ）と`|>`（Rネイティブパイプ）の両方をサポートしています。

```r
# magrittrパイプ
mtcars %>% filter(cyl == 4) %>% select(mpg, hp)

# Rネイティブパイプ（R 4.1+）
mtcars |> filter(cyl == 4) |> select(mpg, hp)
```

### データベース連携

dplyrはdbplyrパッケージを通じてデータベースへのクエリをサポートしています。同じ構文でローカルデータフレームとリモートデータベースの両方を操作できます。

### 参考リンク

- [dplyr公式サイト](https://dplyr.tidyverse.org)
- [GitHubリポジトリ](https://github.com/tidyverse/dplyr)
