0Pricing
R Academy · 강의

pivot_longer()로 넓은 형식에서 긴 형식으로

분석을 위해 넓은 형식의 테이블을 정돈된 긴 형식으로 변환합니다.

pivot_longer()로 넓은 형식에서 긴 형식으로은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

넓은 형식과 긴 형식의 데이터

데이터는 넓은 형식(대상 하나당 한 행, 여러 값 열)이나 긴 형식(관측값 하나당 한 행, 변수 이름 열과 값 열)으로 저장할 수 있습니다. 시각화와 모델링에 사용하는 많은 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 열이 한두 개뿐이고 값 열이 많은 경우 편리합니다.

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가 열에서 미적 요소를 매핑하기 때문입니다. 모든 값이 하나의 열에 있고 범주가 다른 열에 있으면 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'
)

자주 묻는 질문

“pivot_longer()로 넓은 형식에서 긴 형식으로” 강의는 무료인가요?

네 — “pivot_longer()로 넓은 형식에서 긴 형식으로” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“pivot_longer()로 넓은 형식에서 긴 형식으로”에서 뭘 배우나요?

분석을 위해 넓은 형식의 테이블을 정돈된 긴 형식으로 변환합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“pivot_longer()로 넓은 형식에서 긴 형식으로” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. pivot_longer()로 넓은 형식에서 긴 형식으로
  2. pivot_wider()로 긴 형식에서 넓은 형식으로
  3. 문자열 열을 위한 separate()와 unite()
  4. 데이터 프레임 중첩 및 중첩 해제
← R Academy(으)로 돌아가기