R pivot_longer 와 pivot_wider 완벽 정복: 헷갈림 없이 끝내는 데이터 형태 변환

tidyr::pivot_longer와 pivot_wider를 왜/언제/어떻게 쓰는지, 인자별 의미와 코드·결과 예시까지 아주 자세히 정리한 실전 가이드.
데이터·통계
저자

Ikmyungterran

공개

2026년 2월 1일

Modified

2026년 3월 8일

0. 이 글의 목표

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

pivot_longer/pivot_wider 개념 이미지

사용 패키지

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 변환

pivot_wider 개념 이미지

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 같은 인수를 확인하면서 쓰는 편이 더 효율적입니다.

함께 읽으면 좋은 글