tidyr

データのreshaping(形状変換)とtidying(整理)のためのパッケージ。wide形式とlong形式の変換、ネストされたデータの操作、欠損値の処理など、データクリーニングに必須の機能を提供。

Rデータ整形データ変換tidyversepivotreshapeデータクリーニング

GitHub概要

tidyverse/tidyr

Tidy Messy Data

スター1,406
ウォッチ70
フォーク419
作成日:2014年6月10日
言語:R
ライセンス:Other

トピックス

rtidy-data

スター履歴

tidyverse/tidyr Star History
データ取得日時: 2025/7/16 11:28

フレームワーク

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エコシステムの一部として、データサイエンスワークフローの前処理段階で不可欠な存在。整然データの原則を実践することで、後続の分析や可視化を大幅に効率化できます。