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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- pivot_longer()によるワイド形式からロング形式への変換
- pivot_wider()によるロング形式からワイド形式への変換
- 文字列列のためのseparate()とunite()
- データフレームのネストとアンネスト