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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- pivot_longer()로 넓은 형식에서 긴 형식으로
- pivot_wider()로 긴 형식에서 넓은 형식으로
- 문자열 열을 위한 separate()와 unite()
- 데이터 프레임 중첩 및 중첩 해제