tidyr
データのreshaping(形状変換)とtidying(整理)のためのパッケージ。wide形式とlong形式の変換、ネストされたデータの操作、欠損値の処理など、データクリーニングに必須の機能を提供。
GitHub概要
tidyverse/tidyr
Tidy Messy Data
トピックス
スター履歴
フレームワーク
tidyr
概要
tidyrは、R言語でデータの形状変換(reshaping)と整理(tidying)を行うためのパッケージです。pivot_longer()とpivot_wider()関数により、ワイド形式とロング形式の変換を直感的に実行でき、整然データ(tidy data)の原則に基づいたデータ構造化を支援します。
詳細
tidyr(タイディーアール)は、Hadley Wickhamによって開発されたRのデータ整形専用パッケージです。"tidy data"(整然データ)の概念を実装し、データ分析の前処理を効率化します。2014年に初版がリリースされ、reshape2パッケージの後継として位置づけられています。最新版では、pivot_longer()とpivot_wider()が主要な関数となり、従来のgather()とspread()に代わってより柔軟で強力なデータ変換を提供。nest()とunnest()によるネストされたデータフレームの操作、separate()とunite()による列の分割・結合、fill()による欠損値の補完、drop_na()による欠損値の除去など、データクリーニングに必要な機能を網羅。tidyverseの一部として、dplyrやggplot2とシームレスに連携し、パイプ演算子(%>%)を使った流暢なデータ処理を実現。整然データの3つの原則(各変数は列、各観測は行、各値はセル)を実現することで、後続の分析を大幅に簡素化します。
メリット・デメリット
メリット
- 直感的な関数名: pivot、nest、fill等の動詞で操作が明確
- 柔軟な変換: 複雑なデータ形状変換も簡潔に記述
- tidyverse統合: 他のパッケージと一貫した文法
- 強力なpivot関数: 旧gather/spreadより高機能
- ネストデータ対応: リスト列の効率的な処理
- 欠損値処理: 多様な補完・除去オプション
デメリット
- メモリ使用: 大規模データでは変換時に注意必要
- 学習曲線: 整然データの概念理解が前提
- パフォーマンス: data.tableより遅い場合がある
- 後方互換性: 関数の非推奨化による混乱
主な使用事例
- ワイド/ロング形式のデータ変換
- アンケートデータの整形
- 時系列データの構造化
- 複数変数の分離・結合
- 欠損値の体系的処理
- データベース正規化
- 可視化前のデータ準備
基本的な使い方
インストール
# CRANからインストール
install.packages("tidyr")
# tidyverse全体をインストール
install.packages("tidyverse")
# 開発版をインストール
devtools::install_github("tidyverse/tidyr")
# ライブラリの読み込み
library(tidyr)
基本的な操作
# サンプルデータ
df_wide <- data.frame(
id = 1:3,
name = c("Alice", "Bob", "Charlie"),
math_2023 = c(90, 85, 78),
math_2024 = c(92, 88, 80),
english_2023 = c(88, 90, 85),
english_2024 = c(90, 91, 87)
)
# pivot_longer: ワイドからロング形式へ
df_long <- df_wide %>%
pivot_longer(
cols = -c(id, name),
names_to = c("subject", "year"),
names_sep = "_",
values_to = "score"
)
# pivot_wider: ロングからワイド形式へ
df_wide_back <- df_long %>%
pivot_wider(
names_from = c(subject, year),
values_from = score,
names_sep = "_"
)
# separate: 列の分割
df <- data.frame(
id = 1:3,
date_time = c("2024-01-15 10:30", "2024-01-16 14:20", "2024-01-17 09:15")
)
df_separated <- df %>%
separate(date_time, into = c("date", "time"), sep = " ")
# unite: 列の結合
df_united <- df_separated %>%
unite("datetime", date, time, sep = "T")
# fill: 欠損値の補完
df_missing <- data.frame(
year = c(2020, NA, NA, 2023, NA),
value = c(100, 110, 120, 130, 140)
)
df_filled <- df_missing %>%
fill(year, .direction = "down")
高度な操作
# 複雑なpivot操作
sales_data <- data.frame(
store = rep(c("A", "B"), each = 6),
product = rep(c("X", "Y", "Z"), 4),
month = rep(c("Jan", "Feb"), each = 3, times = 2),
revenue = runif(12, 1000, 5000),
units = sample(50:200, 12)
)
# 複数の値列を同時にpivot
sales_wide <- sales_data %>%
pivot_wider(
names_from = c(product, month),
values_from = c(revenue, units),
names_sep = "_",
names_glue = "{.value}_{product}_{month}"
)
# nest: データのネスト
nested_data <- sales_data %>%
group_by(store) %>%
nest()
# unnest: ネストの解除
unnested_data <- nested_data %>%
unnest(cols = data)
# complete: 欠損組み合わせの補完
complete_data <- sales_data %>%
complete(store, product, month,
fill = list(revenue = 0, units = 0))
# drop_na: 欠損値を含む行の削除
clean_data <- data.frame(
x = c(1, 2, NA, 4),
y = c("a", NA, "c", "d"),
z = c(TRUE, TRUE, FALSE, NA)
) %>%
drop_na() # すべての列でNAを含む行を削除
# 特定の列のみ対象
clean_data_x <- data.frame(
x = c(1, 2, NA, 4),
y = c("a", NA, "c", "d")
) %>%
drop_na(x) # x列のNAのみ考慮
実践的な例
# 時系列データの整形
library(dplyr)
# 複数指標の時系列データ
economic_data <- data.frame(
date = seq(as.Date("2023-01-01"), by = "month", length.out = 12),
gdp_growth = runif(12, -2, 5),
inflation = runif(12, 0, 4),
unemployment = runif(12, 3, 7)
)
# ロング形式に変換して分析
economic_long <- economic_data %>%
pivot_longer(
cols = -date,
names_to = "indicator",
values_to = "value"
) %>%
mutate(
indicator = factor(indicator,
levels = c("gdp_growth", "inflation", "unemployment"),
labels = c("GDP成長率", "インフレ率", "失業率"))
)
# アンケートデータの整形
survey_data <- data.frame(
respondent_id = 1:100,
q1_satisfied = sample(1:5, 100, replace = TRUE),
q1_important = sample(1:5, 100, replace = TRUE),
q2_satisfied = sample(1:5, 100, replace = TRUE),
q2_important = sample(1:5, 100, replace = TRUE)
)
survey_long <- survey_data %>%
pivot_longer(
cols = -respondent_id,
names_to = c("question", "measure"),
names_sep = "_",
values_to = "score"
) %>%
pivot_wider(
names_from = measure,
values_from = score
)
最新のトレンド(2025年)
- pivot関数の機能拡張: より複雑な変換パターンのサポート
- パフォーマンス改善: 大規模データセットでの高速化
- 型安全性の向上: vctrsパッケージとの統合強化
- 新しいヘルパー関数: データ検証・診断ツール
- Arrow統合: より効率的なデータ交換
まとめ
tidyrは2025年においても、Rでのデータ整形の標準ツールとして重要な役割を果たしています。pivot_longer()とpivot_wider()を中心とした直感的な関数群により、複雑なデータ変換も簡潔に記述できます。tidyverseエコシステムの一部として、データサイエンスワークフローの前処理段階で不可欠な存在。整然データの原則を実践することで、後続の分析や可視化を大幅に効率化できます。