R Academy · レッスン

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

ワイド形式のテーブルを、分析しやすい整然としたロング形式に変形します。

レッスン 1/413 ステップ

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

ワイド形式とロング形式のデータ

データは、ワイド形式(対象ごとに1行で、複数の値の列を持つ)またはロング形式(観測値ごとに1行で、変数名の列と値の列を持つ)で保存できます。可視化やモデリング用の多くのRパッケージは、ロング形式を想定しています。

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

pivot_longer()の基本

pivot_longer(df, cols, names_to, values_to)は、ワイド形式をロング形式に変換します。colsにはピボットする列を指定し、names_toは元の列名を格納する新しい列、values_toは値を格納する新しい列を指定します。

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

starts_with()で列を選択する

列を明示的に列挙する代わりに、colsの中でtidyselectヘルパーを使用できます。starts_with('prefix')、ends_with('suffix')、contains('string')は、命名規則が統一された列をピボットする際に特に便利です。

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

-colで列を除外する

別の方法として、-col_nameを使ってピボットから除外する列を指定できます。それ以外のすべての列がピボットされます。ID列が1つか2つだけで、値の列が多数ある場合に便利です。

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — プレフィックスを削除する

列名がscore_q1、score_q2のようにプレフィックスを持つ場合、names_prefix引数は、結果のnames_to列からそのプレフィックスを削除します。これにより、識別子をすっきりさせられます。

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

複数の列セットをピボットする

複数の値の列グループ(例:sales_q1とcost_q1の両方)がある場合は、names_toに複数の値を指定し、names_patternで列名を構成要素に分割します。

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — 型を変換する

デフォルトでは、新しい名前の列は文字型になります。names_transformを使うと、名前の列を別の型へ自動的に変換できます(例:y2020、y2021のような列名から年を整数に変換する)。

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — 欠損値を削除する

ワイド形式で一部の列と行の組み合わせに欠損値がある場合、ロング形式ではNAとして現れます。values_drop_na = TRUEを設定すると、値がNAの行を自動的に削除できます。

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

ロング形式でggplot2を活用する

ロング形式にピボットする最も重要な理由は、ggplot2が列から美的属性をマッピングするためです。すべての値を1つの列に、カテゴリーを別の列にまとめると、color = quarterやfacet_wrap(~quarter)を簡単に使えます。

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

数値の列名でピボットする

列名が純粋な数値(例:年を表す2020、2021)になることがあります。Rでは、データフレーム内の数値の列名は引用符で囲んで扱います。num_range('', 2020:2023)、またはcols引数内でバッククォートによる引用を使用してください。

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

ピボット結果を比較する

ピボット後は、結果を検証してください。行数はnrow(wide) * n_pivoted_colsになるはずです。また、names_to列の一意な値は、プレフィックスを削除した場合を除き、元の列名と一致するはずです。

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

理解度チェック

pivot_longer()のnames_prefix引数は何をしますか?

まとめ:pivot_longer()

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

  • pivot_longer(df, cols, names_to, values_to)が基本関数です
  • colsではtidyselectを使用できます:starts_with()、-id_col、c('a','b')
  • names_prefixは列名の先頭にある文字列を削除します
  • names_transformは名前の列の型を変換します(例:整数型)
  • values_drop_na = TRUEはNAの行を自動的に削除します
  • ロング形式は、ggplot2、多くのモデリング関数、統計検定で必要になります
  • 検証方法:ロング形式の行数 = ワイド形式の行数 × ピボットした列数
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

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

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

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

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

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

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

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

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

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

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

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

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