0. 이 글의 목표
pivot_longer()와 pivot_wider()는 R 데이터 변환에서 가장 자주 쓰이는 핵심 함수입니다. 이 글은 “왜 쓰는지 → 언제 쓰는지 → 어떻게 쓰는지”를 정확히 연결해서 설명합니다. 모든 예시는 코드 + 결과를 함께 제공합니다.

사용 패키지
library(tidyverse)1. 기본 개념 먼저 잡기 (wide vs long)
1.1 wide 형태 (가로형)
- 여러 변수(연도/성별/상품 등)가 열(column)로 퍼져 있는 상태
- 사람 눈엔 보기 쉽지만, 분석·시각화에 불리
1.2 long 형태 (세로형)
- 변수가 행(row)으로 모여 있는 상태
- ggplot2, group_by, summarise와 궁합이 좋음
정리: pivot_longer = wide → long, pivot_wider = long → wide
2. pivot_longer(): wide → long 변환
2.1 언제 쓰나?
- 연도별 컬럼이 많아 분석이 불편할 때
- 남/녀/지역 등 여러 열을 한 열로 모아 비교해야 할 때
2.2 기본 문법
pivot_longer(
data,
cols,
names_to = "name",
values_to = "value"
)2.3 가장 기본 예시
df <- tibble(
id = c(1,2),
y2023 = c(10, 20),
y2024 = c(15, 25)
)
df_long <- df %>%
pivot_longer(
cols = c(y2023, y2024),
names_to = "year",
values_to = "sales"
)
df_long예시 출력:
# A tibble: 4 × 3
id year sales
<dbl> <chr> <dbl>
1 1 y2023 10
2 1 y2024 15
3 2 y2023 20
4 2 y2024 25
3. pivot_longer 주요 인자 완벽 이해
3.1 cols
왜 필요한가? - 변환할 대상 열을 명확히 지정해야 합니다.
pivot_longer(df, cols = y2023:y2024)3.2 names_to
언제 쓰나? - 열 이름이 한 변수(예: 연도)로 들어갈 때
pivot_longer(df, cols = y2023:y2024, names_to = "year")3.3 values_to
언제 쓰나? - 값 컬럼의 이름을 명확히 지정할 때
pivot_longer(df, cols = y2023:y2024, values_to = "sales")3.4 names_prefix
왜 쓰나? - 열 이름에서 불필요한 접두어 제거
df %>%
pivot_longer(
cols = y2023:y2024,
names_to = "year",
names_prefix = "y",
values_to = "sales"
)예시 출력:
# A tibble: 4 × 3
id year sales
<dbl> <chr> <dbl>
1 1 2023 10
2 1 2024 15
3 2 2023 20
4 2 2024 25
3.5 names_sep / names_pattern
언제 쓰나? - 열 이름이 여러 조각(예: male_2024)일 때
df2 <- tibble(
id = 1:2,
male_2023 = c(5, 6),
female_2023 = c(7, 8)
)
df2 %>%
pivot_longer(
cols = -id,
names_to = c("gender", "year"),
names_sep = "_",
values_to = "count"
)예시 출력:
# A tibble: 4 × 4
id gender year count
<int> <chr> <chr> <dbl>
1 1 male 2023 5
2 1 female 2023 7
3 2 male 2023 6
4 2 female 2023 8
4. pivot_wider(): long → wide 변환

4.1 언제 쓰나?
- 보고서처럼 한 행에 여러 값을 가로로 펼쳐야 할 때
- 피벗 테이블 형태가 필요할 때
4.2 기본 문법
pivot_wider(
data,
names_from,
values_from
)4.3 가장 기본 예시
long <- tibble(
id = c(1,1,2,2),
year = c("2023","2024","2023","2024"),
sales = c(10,15,20,25)
)
long %>%
pivot_wider(
names_from = year,
values_from = sales
)예시 출력:
# A tibble: 2 × 3
id `2023` `2024`
<dbl> <dbl> <dbl>
1 1 10 15
2 2 20 25
5. pivot_wider 주요 인자 완벽 이해
5.1 names_from
무엇을? - 새로 만들 열의 이름이 될 컬럼 지정
5.2 values_from
무엇을? - 실제 값이 들어갈 컬럼 지정
5.3 values_fill
왜 쓰나? - 결측값을 원하는 값으로 채우기
long2 <- tibble(
id = c(1,2),
year = c("2023","2024"),
sales = c(10, 20)
)
long2 %>%
pivot_wider(
names_from = year,
values_from = sales,
values_fill = 0
)예시 출력:
# A tibble: 2 × 3
id `2023` `2024`
<dbl> <dbl> <dbl>
1 1 10 0
2 2 0 20
5.4 values_fn
언제 쓰나? - 중복 조합이 있을 때 요약 함수로 값을 합칠 때
sales <- tibble(
id = c(1,1,1),
year = c("2023","2023","2024"),
sales = c(10, 15, 20)
)
sales %>%
pivot_wider(
names_from = year,
values_from = sales,
values_fn = sum
)예시 출력:
# A tibble: 1 × 3
id `2023` `2024`
<dbl> <dbl> <dbl>
1 1 25 20
6. pivot_longer + pivot_wider 실전 패턴
6.1 분석을 위해 길게 만들기
iris %>%
pivot_longer(
cols = starts_with("Sepal"),
names_to = "part",
values_to = "length"
) %>%
head()예시 출력:
# A tibble: 6 × 3
Species part length
<fct> <chr> <dbl>
1 setosa Sepal.Length 5.1
2 setosa Sepal.Width 3.5
3 setosa Sepal.Length 4.9
4 setosa Sepal.Width 3.0
5 setosa Sepal.Length 4.7
6 setosa Sepal.Width 3.2
6.2 보고서를 위해 넓게 만들기
iris %>%
pivot_longer(
cols = starts_with("Sepal"),
names_to = "part",
values_to = "length"
) %>%
group_by(Species, part) %>%
summarise(mean_len = mean(length), .groups = "drop") %>%
pivot_wider(names_from = part, values_from = mean_len)예시 출력:
# A tibble: 3 × 3
Species Sepal.Length Sepal.Width
<fct> <dbl> <dbl>
1 setosa 5.01 3.43
2 versicolor 5.94 2.77
3 virginica 6.59 2.97
7. 초보자가 가장 많이 헷갈리는 포인트 정리
| 상황 | 해결 방법 |
|---|---|
| 열 이름에서 숫자만 떼고 싶다 | names_prefix 사용 |
열 이름이 남_2024처럼 두 조각이다 |
names_sep 또는 names_pattern |
| pivot_wider 했더니 NA가 많다 | values_fill로 기본값 지정 |
| 중복 조합 때문에 에러가 난다 | values_fn = sum/mean 등 요약 함수 지정 |
8. 마무리
pivot_longer()와 pivot_wider()는 데이터 분석의 기본 문법입니다. 이 두 함수만 제대로 익혀도 - 시각화(ggplot2) - 요약 통계 - 보고서 생성 이 훨씬 쉬워집니다.
공식 문서 및 참고 링크
pivot_longer()와 pivot_wider()는 인수가 많아서 한 번에 외우기 어렵습니다. 그래서 실무에서는 공식 문서를 옆에 두고 names_to, values_to, names_pattern, values_fill 같은 인수를 확인하면서 쓰는 편이 더 효율적입니다.
pivot_longer()공식 문서: https://tidyr.tidyverse.org/reference/pivot_longer.htmlpivot_wider()공식 문서: https://tidyr.tidyverse.org/reference/pivot_wider.html- tidyr 전체 레퍼런스 인덱스: https://tidyr.tidyverse.org/reference/index.html