# dplyr

## 概要

dplyrは、Rにおけるデータ操作のための文法（Grammar of Data Manipulation）を提供するパッケージです。データフレームや類似オブジェクトに対して、一貫性のある直感的なAPIでデータの変換・集計・結合などの操作を行うことができます。メモリ内のデータだけでなく、データベースやApache Sparkなどの外部バックエンドとも連携可能です。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| 行の操作（Row operations） | `filter()`, `filter_out()` で条件に基づく行の選択・除外、`arrange()` で並べ替え、`slice()` 系関数でインデックスベースの行選択、`distinct()` で重複除去 |
| 列の操作（Column operations） | `select()` で列の選択・リネーム、`mutate()` で新しい列の作成・既存列の変更、`relocate()` で列の位置変更、`rename()` で列名変更 |
| グループ操作（Group operations） | `group_by()` でグループ化、`summarise()` でグループごとの集約、`reframe()` で複数行を返す集約、`rowwise()` で行単位の操作 |
| 結合操作（Join operations） | `inner_join()`, `left_join()`, `right_join()`, `full_join()` によるミューテーティング結合、`semi_join()`, `anti_join()` によるフィルタリング結合、`cross_join()` によるクロス結合、`nest_join()` によるネスト結合 |
| 集合演算（Set operations） | `intersect()`, `union()`, `setdiff()`, `symdiff()` によるデータフレームの集合演算 |
| 行の結合（Binding） | `bind_rows()`, `bind_cols()` による複数データフレームの結合 |
| ウィンドウ関数（Window functions） | `lead()`, `lag()` で前後の値を参照、`row_number()`, `dense_rank()`, `min_rank()` などのランキング関数、`cumsum()`, `cummean()` などの累積関数 |
| 条件分岐（Conditional operations） | `if_else()`, `case_when()`, `case_match()` による条件分岐、`coalesce()` による欠損値の補完 |
| データソース連携（Backend support） | dbplyr（データベース）、dtplyr（data.table）、duckplyr（DuckDB）、arrow（Apache Arrow）、sparklyr（Apache Spark）との連携 |

## 技術スタック

### コア

- 言語: R (>= 4.1.0)
- パッケージタイプ: Rパッケージ（C++拡張を含む）
- ライセンス: MIT

### 主要ライブラリ

- **rlang** (>= 1.1.7): tidy evaluation（tidyeval）の基盤となるメタプログラミング機能を提供
- **vctrs** (>= 0.7.1): 型安全なベクトル操作とデータフレーム操作の基盤
- **tibble** (>= 3.2.0): 拡張データフレーム（tibble）の実装
- **tidyselect** (>= 1.2.0): 列選択のためのDSL（`starts_with()`, `ends_with()`, `where()` など）
- **pillar** (>= 1.9.0): tibbleの表示フォーマット
- **magrittr** (>= 1.5): パイプ演算子 `%>%` の提供
- **glue** (>= 1.3.2): 文字列補間
- **cli** (>= 3.6.2): コマンドラインインターフェース出力
- **lifecycle** (>= 1.0.5): 関数のライフサイクル管理（deprecated, superseded など）
- **R6**: オブジェクト指向プログラミング
- **generics**: S3ジェネリック関数の共有

## ディレクトリ構成

```
dplyr-main/
├── R/                      # Rソースコード
│   ├── mutate.R           # mutate() 関数の実装
│   ├── filter.R           # filter() 関数の実装
│   ├── select.R           # select() 関数の実装
│   ├── summarise.R        # summarise() 関数の実装
│   ├── arrange.R          # arrange() 関数の実装
│   ├── group-by.R         # group_by() 関数の実装
│   ├── join.R             # 結合関数（*_join）の実装
│   ├── slice.R            # slice() 系関数の実装
│   ├── across.R           # across() 関数の実装
│   ├── rowwise.R          # rowwise() 関数の実装
│   ├── bind-rows.R        # bind_rows(), bind_cols() の実装
│   └── ...                # その他の関数実装
├── src/                    # C++ソースコード
│   ├── mutate.cpp         # mutate のC++実装
│   ├── filter.cpp         # filter のC++実装
│   ├── slice.cpp          # slice のC++実装
│   ├── summarise.cpp      # summarise のC++実装
│   ├── group_by.cpp       # group_by のC++実装
│   ├── group_data.cpp     # グループデータ管理
│   └── ...                # その他のC++実装
├── man/                    # Roxygen2生成ドキュメント（.Rdファイル）
├── vignettes/              # ビネット（チュートリアル）
│   ├── dplyr.Rmd          # dplyr入門
│   ├── two-table.Rmd      # 2テーブル操作
│   ├── grouping.Rmd       # グループ操作
│   ├── programming.Rmd    # プログラミングでの使用
│   ├── window-functions.Rmd # ウィンドウ関数
│   ├── rowwise.Rmd        # rowwise操作
│   ├── colwise.Rmd        # 列単位操作
│   └── ...                # その他のビネット
├── tests/                  # テストコード
│   ├── testthat.R         # テストランナー
│   └── testthat/          # testthatテストケース
├── data/                   # サンプルデータセット
├── data-raw/               # データ生成スクリプト
├── DESCRIPTION             # パッケージメタデータ
├── NAMESPACE               # エクスポート・インポート定義
├── NEWS.md                 # 変更履歴
├── README.md               # プロジェクトREADME
├── LICENSE                 # ライセンスファイル
├── _pkgdown.yml            # pkgdownサイト設定
└── .github/                # GitHub Actions設定
```

## セットアップ

### 必要条件

- R >= 4.1.0
- C++コンパイラ（パッケージのインストール時に必要）

### インストール手順

#### CRANからインストール（安定版）

```r
# tidyverse全体をインストール（dplyrを含む）
install.packages("tidyverse")

# dplyr単体でインストール
install.packages("dplyr")
```

#### GitHubからインストール（開発版）

```r
# pakパッケージを使用
install.packages("pak")
pak::pak("tidyverse/dplyr")

# または devtools を使用
# install.packages("devtools")
# devtools::install_github("tidyverse/dplyr")
```

## 開発

### コードスタイル・Linter

dplyrはRパッケージの標準的な開発規約に従っています。

- **air.toml**: コードフォーマット設定（air linter）
- **Roxygen2**: ドキュメント生成（`roxygen2::roxygenise()`）

### テストの実行

```r
# testthatによるユニットテスト
devtools::test()

# 特定のテストファイルのみ実行
testthat::test_file("tests/testthat/test-mutate.R")

# R CMD check（パッケージ全体のチェック）
devtools::check()
```

### ドキュメントの生成

```r
# Roxygen2によるドキュメント生成
devtools::document()

# pkgdownサイトの生成
pkgdown::build_site()
```

### ビネットのビルド

```r
# 全ビネットのビルド
devtools::build_vignettes()

# 個別ビネットの確認
rmarkdown::render("vignettes/dplyr.Rmd")
```
