0Pricing
R Academy · レッスン

pivot_wider()によるロング形式からワイド形式への変換

キーと値の組をワイド形式のテーブルに戻します。

「pivot_wider()によるロング形式からワイド形式への変換」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

ワイド形式を使う場面

ロング形式は分析に適していますが、レポート、スプレッドシート、特定のアルゴリズム(例:相関行列)ではワイド形式が必要になることがあります。pivot_wider()はpivot_longer()の逆で、1つの列の値を複数の新しい列に展開します。

library(tidyr)

# Long format: one row per student-quarter combination
long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')

pivot_wider()の基本

pivot_wider(df, names_from, values_from)は、ロング形式をワイド形式に変換します。names_fromには値を新しい列名にする列を指定し、values_fromには新しい列に入れる値の列を指定します。

library(tidyr)

long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

wide_df <- pivot_wider(
  long_df,
  names_from = quarter,
  values_from = score
)

print(wide_df)

id_cols — 行のキーを特定する

id_colsには、ワイド形式の出力で各行を一意に識別する列を指定します。デフォルトでは、dplyrはnames_fromまたはvalues_fromに指定されていないすべての列を使用します。明示的に設定すると、予期しないグループ化を防げます。

library(tidyr)

df <- data.frame(
  year = c(2023,2023,2024,2024),
  region = c('East','West','East','West'),
  quarter = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 200, 120, 220)
)

pivot_wider(
  df,
  id_cols = c(year, quarter),
  names_from = region,
  values_from = revenue
)

values_fill — 欠落した組み合わせの処理

id_cols と names_from の一部の組み合わせが存在しない場合、結果のセルは NA になります。values_fill を使用すると、こうした欠落値をデフォルト値(カウントや合計なら 0 など)に置き換えられます。

library(tidyr)

df <- data.frame(
  product = c('A','A','B'),
  channel = c('online','store','online'),
  sales = c(100, 150, 200)
)

# 'B' has no 'store' data — fill with 0
pivot_wider(
  df,
  names_from = channel,
  values_from = sales,
  values_fill = 0
)

names_prefix — プレフィックスの追加

names_prefix を使用すると、すべての新しい列名の先頭に文字列を追加できます。names_from の値が数値の場合や、列名をより説明的にしたい場合に便利です。

library(tidyr)

df <- data.frame(
  student = c('Alice','Alice','Bob','Bob'),
  quarter = c(1, 2, 1, 2),
  score = c(85, 90, 78, 82)
)

# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  names_prefix = 'q'
)

複数の values_from 列

values_from にベクトルを渡すと、複数の値列を一度にピボットできます。結果の列名は、値列の名前とカテゴリを組み合わせた value_name として付けられます。

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 200, 210),
  units = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, units)
)

values_fn による重複の処理

同じ id + name の組み合わせに複数の値がある場合、pivot_wider はどの値を使用すべきか判断できないため、警告を表示してリスト列を返します。values_fn を使用し、集約関数を指定して解決してください。

library(tidyr)

# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob'),
  quarter = c('Q1','Q1','Q2','Q1','Q2'),
  score = c(85, 87, 90, 78, 82)
)

# Resolve duplicates by taking the mean
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  values_fn = mean
)

名前付きリストでの values_fn

values_fn に名前付きリストを渡すと、異なる値列に異なる集約関数を同時に適用できます。異なる集計方法が必要な複数の値列をピボットする場合に、特に強力です。

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 120, 200, 210),
  orders = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, orders),
  values_fn = list(revenue = sum, orders = sum)
)

クロス集計表の作成

データフレーム形式のクロス集計表(分割表)は、dplyr::count() でカウントした後に pivot_wider() を使うことで簡単に作成できます。これにより、両パッケージの機能を組み合わせて度数分析を行えます。

library(tidyr)
library(dplyr)

survey <- data.frame(
  dept = c('HR','HR','Eng','Eng','HR','Eng'),
  response = c('Yes','No','Yes','Yes','Yes','No')
)

survey %>%
  count(dept, response) %>%
  pivot_wider(
    names_from = response,
    values_from = n,
    values_fill = 0
  )

ラウンドトリップ: Long → Wide → Long

pivot_longer() と pivot_wider() の逆関係を理解すると、エラーを見つけやすくなります。ラウンドトリップ(long→wide→long)を行うと、行の順序と型変換を除き、元のデータが返されるはずです。

library(tidyr)

original_long <- data.frame(
  id = c(1,1,2,2),
  key = c('a','b','a','b'),
  value = c(10, 20, 30, 40)
)

# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)

# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')

実践: 成績レポート

典型的な使用例は、テストの成績をまとめたロング形式のテーブルを、生徒ごと・科目ごとのレポートテーブルに変形することです。dplyr::arrange() や rename() と組み合わせると、見やすくそのまま提示できる出力を作成できます。

library(tidyr)
library(dplyr)

scores <- data.frame(
  student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
  subject = c('Math','Science','Math','Science','Math','Science'),
  score = c(92, 88, 85, 91, 79, 83)
)

scores %>%
  pivot_wider(names_from=subject, values_from=score) %>%
  mutate(average = round((Math + Science) / 2, 1)) %>%
  arrange(desc(average))

確認問題

同じ id + name の組み合わせに複数の値がある状態で pivot_wider() を呼び出すと、どうなりますか?

まとめ: pivot_wider()

ロング形式からワイド形式への変換における重要なポイント:

  • pivot_wider(names_from, values_from) は、キー列を複数の新しい列に展開します
  • id_cols は、各行を識別する列を指定します
  • values_fill = 0(または任意のスカラー値)は、欠落している組み合わせを埋めます
  • names_prefix は、数値または曖昧な列名を避けるために文字列を先頭に追加します
  • values_fn は、集約関数によって重複したセルの値を解決します
  • values_from にベクトルを渡すと、複数の値列を同時にピボットできます
  • count() の後に使用すると、クロス集計表を効率的に作成できます
library(tidyr)
library(dplyr)

data.frame(
  region = c('East','East','West','West'),
  metric = c('revenue','units','revenue','units'),
  value = c(100, 10, 200, 20)
) %>%
  pivot_wider(
    names_from = metric,
    values_from = value,
    values_fill = 0
  ) %>%
  mutate(revenue_per_unit = revenue / units)

よくある質問

「pivot_wider()によるロング形式からワイド形式への変換」レッスンは無料ですか?

はい。「pivot_wider()によるロング形式からワイド形式への変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「pivot_wider()によるロング形式からワイド形式への変換」で何を学びますか?

キーと値の組をワイド形式のテーブルに戻します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「pivot_wider()によるロング形式からワイド形式への変換」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. pivot_longer()によるワイド形式からロング形式への変換
  2. pivot_wider()によるロング形式からワイド形式への変換
  3. 文字列列のためのseparate()とunite()
  4. データフレームのネストとアンネスト
← R Academyに戻る