R dplyr 사용법|데이터 전처리 핵심 함수 6가지

dplyr는 R에서 행을 추출하고, 열을 선택하고, 새로운 변수를 만들고, 데이터를 요약할 때 가장 자주 사용하는 데이터 전처리 패키지입니다. 모든 함수를 한꺼번에 외울 필요는 없습니다. slice(), filter(), select(), mutate(), arrange(), summarise() 여섯 가지부터 익히면 대부분의 기본 전처리 작업을 처리할 수 있습니다.

이 글의 핵심: 여섯 함수를 따로 외우기보다 같은 데이터에 차례로 적용해 보세요. 마지막에는 파이프로 연결한 하나의 전처리 코드가 완성됩니다.

블로그 글을 작성함에 있어서 최대한 정확한 정보를 제공하고자 노력하고 있습니다만, 간혹 오류가 있을 수 있습니다. 발견시 댓글 달아주시면 정정하겠습니다. 블로그의 링크들을 통하여 구매하시면 소정의 커미션이 슬통에 들어옵니다.

dplyr 핵심 함수 6가지 한눈에 보기

R dplyr 패키지 로고와 핵심 함수 사용법
목적함수대표 사용법
행 번호로 선택slice()slice(data, 1:5)
조건에 맞는 행 추출filter()filter(data, 합계 > 100)
필요한 열 선택select()select(data, 날짜, 합계)
새로운 열 생성mutate()mutate(data, 총합 = x + y)
행 정렬arrange()arrange(data, desc(합계))
통계량 계산summarise()summarise(data, 평균 = mean(합계))

dplyr 공식 문서에서도 행, 열, 그룹 요약이라는 기준으로 함수를 구분합니다. 위치로 행을 고를 때는 slice(), 조건으로 고를 때는 filter(), 열을 다룰 때는 select()와 mutate()를 사용한다고 이해하면 훨씬 쉽습니다.

dplyr 설치와 예제 데이터 준비

dplyr만 설치하려면 첫 번째 명령을, 데이터 불러오기와 시각화 패키지까지 함께 사용하려면 두 번째 명령을 실행합니다. 설치는 한 번만 하면 되고, library()는 R을 새로 실행할 때마다 불러와야 합니다.

# dplyr만 설치
install.packages("dplyr")
library(dplyr)

# tidyverse 전체를 사용할 때
install.packages("tidyverse")
library(tidyverse)

통영시립박물관 방문자 데이터 불러오기

통영시립박물관 외관
예제에서는 통영시립박물관의 2022년 방문자 데이터를 사용합니다.

예제 CSV 파일을 내려받은 뒤 작업 폴더의 data 폴더에 저장하세요. 파일명이 다르다면 아래 경로를 실제 파일명에 맞게 바꾸면 됩니다.

library(tidyverse)

city_museum <- read_csv(
  "./data/city_museum2022.csv",
  locale = locale(encoding = "UTF-8"),
  show_col_types = FALSE
)

glimpse(city_museum)

데이터에는 날짜, 통영 방문자 합계, 타지역 방문자 합계, 연령대별 방문자 수, 휴관 여부 등이 들어 있습니다. 한글 CSV가 깨진다면 R에서 한글 CSV 인코딩을 설정하는 방법을 먼저 확인하세요.

이후 예제를 간단하게 보기 위해 필요한 네 개 열만 선택합니다.

museum <- city_museum |>
  select(날짜, 통영_합계, 타지역_합계, 휴관일)

1. slice(): 행 번호로 데이터 추출하기

slice()는 행의 위치를 기준으로 데이터를 선택합니다. 첫 번째 행부터 다섯 번째 행까지 확인하려면 다음과 같이 작성합니다.

museum |>
  slice(1:5)

앞부분이나 뒷부분, 최댓값과 최솟값을 기준으로 행을 고를 때는 slice_*() 계열이 편리합니다.

# 처음 5개 행
museum |> slice_head(n = 5)

# 마지막 5개 행
museum |> slice_tail(n = 5)

# 통영 방문자가 가장 많은 날짜 5개
museum |> slice_max(통영_합계, n = 5)

# 타지역 방문자가 가장 적은 날짜 5개
museum |> slice_min(타지역_합계, n = 5)

slice_max()와 slice_min()은 경계에서 동점이 나오면 해당 행을 모두 반환합니다. 정확히 다섯 행만 필요하면 with_ties = FALSE를 추가하세요.

museum |>
  slice_max(통영_합계, n = 5, with_ties = FALSE)

2. filter(): 조건에 맞는 행 추출하기

slice()가 행 번호를 사용한다면 filter()는 값의 조건을 사용합니다. 타지역 방문자가 300명 이상인 날짜만 추출해 보겠습니다.

museum |>
  filter(타지역_합계 >= 300)

여러 조건을 쉼표로 나누면 모두 만족하는 행만 남습니다. 쉼표는 &와 같은 의미로 사용할 수 있습니다.

# 두 조건을 모두 만족
museum |>
  filter(통영_합계 >= 150, 타지역_합계 >= 150)

# 두 조건 중 하나 이상 만족
museum |>
  filter(통영_합계 >= 150 | 타지역_합계 >= 150)

# 휴관일이 아닌 행만 선택
museum |>
  filter(휴관일 == "N")

결측값을 찾을 때는 열이름 == NA가 아니라 is.na(열이름)을 사용합니다.

3. select(): 필요한 열 선택하기

select()는 분석에 필요한 열만 남기거나 불필요한 열을 제외합니다.

# 필요한 열만 선택
city_museum |>
  select(날짜, 통영_합계, 타지역_합계)

# 휴관일 열 제외
museum |>
  select(-휴관일)

열이 많을 때는 선택 도우미 함수를 사용하면 편합니다.

# 이름이 '성인'으로 시작하는 열
city_museum |>
  select(starts_with("성인"))

# 이름에 '합계'가 들어간 열
city_museum |>
  select(contains("합계"))

# 날짜형 열만 선택
city_museum |>
  select(where(is.Date))

열 이름을 바꿀 때는 rename(새이름 = 기존이름) 순서로 작성합니다.

museum |>
  rename(다른지역_합계 = 타지역_합계)

4. mutate(): 새로운 열 만들기

mutate()는 기존 열을 계산해 파생변수를 만들거나 기존 값을 변환합니다. 통영 방문자와 타지역 방문자를 더해 전체 방문자 수를 만들어 보겠습니다.

museum |>
  mutate(총방문자 = 통영_합계 + 타지역_합계)

여러 열을 한 번에 만들 수 있고, 바로 앞에서 만든 열을 다음 계산에 사용할 수도 있습니다.

museum |>
  mutate(
    총방문자 = 통영_합계 + 타지역_합계,
    지역방문_비율 = 타지역_합계 / 총방문자,
    방문등급 = if_else(총방문자 >= 100, "많음", "보통")
  )

분모가 0인 행에서는 비율이 계산되지 않을 수 있습니다. 실제 분석에서는 if_else(총방문자 == 0, NA_real_, 타지역_합계 / 총방문자)처럼 0으로 나누는 경우를 먼저 처리하세요.

5. arrange(): 오름차순·내림차순 정렬하기

arrange()는 기본적으로 오름차순으로 정렬합니다. 내림차순은 desc()로 감싸면 됩니다.

# 통영 방문자 오름차순
museum |>
  arrange(통영_합계)

# 통영 방문자 내림차순
museum |>
  arrange(desc(통영_합계))

정렬 기준을 여러 개 입력하면 앞의 기준부터 차례로 적용됩니다.

museum |>
  arrange(휴관일, desc(타지역_합계))

6. summarise(): 합계·평균·개수 요약하기

summarise()는 여러 행을 하나의 요약 결과로 줄입니다. 미국식 철자인 summarize()도 같은 함수입니다.

museum |>
  summarise(
    통영_총합 = sum(통영_합계, na.rm = TRUE),
    타지역_평균 = mean(타지역_합계, na.rm = TRUE),
    최고_방문자 = max(통영_합계 + 타지역_합계, na.rm = TRUE),
    관측일수 = n()
  )

group_by()로 그룹별 요약하기

그룹별 통계가 필요하면 group_by() 다음에 summarise()를 연결합니다. 다음 코드는 월별 방문자 합계를 계산합니다.

museum |>
  mutate(월 = lubridate::month(날짜)) |>
  group_by(월) |>
  summarise(
    통영_월별합계 = sum(통영_합계, na.rm = TRUE),
    타지역_월별합계 = sum(타지역_합계, na.rm = TRUE),
    .groups = "drop"
  )

.by로 한 번만 그룹화하기

그룹화가 한 번의 작업에만 필요하다면 .by를 사용할 수 있습니다. group_by()와 달리 결과에 그룹 상태가 남지 않아 별도의 ungroup()이 필요하지 않습니다.

museum |>
  mutate(월 = lubridate::month(날짜)) |>
  summarise(
    통영_월별합계 = sum(통영_합계, na.rm = TRUE),
    타지역_월별합계 = sum(타지역_합계, na.rm = TRUE),
    .by = 월
  )

.by는 summarise()뿐 아니라 mutate(), filter(), slice() 등에서도 사용할 수 있습니다. 자세한 차이는 dplyr의 .by 공식 문서에서 확인할 수 있습니다.

여러 열을 한 번에 계산하는 across()

여러 열에 같은 함수를 반복해서 적용할 때는 across()를 사용합니다. 과거에 사용하던 summarise_at(), summarise_if(), summarise_all() 계열은 현재 across()로 대체되었습니다.

museum |>
  summarise(
    across(
      c(통영_합계, 타지역_합계),
      list(평균 = ~ mean(.x, na.rm = TRUE),
           최댓값 = ~ max(.x, na.rm = TRUE))
    )
  )

열을 선택만 하고 변환하지 않을 때는 pick()이 더 적합합니다. 여러 열 변환에 관한 세부 문법은 across() 공식 문서를 참고하세요.

여섯 함수를 파이프로 연결한 실전 예제

지금까지 배운 함수를 하나의 분석 흐름으로 연결해 보겠습니다. 휴관일을 제외하고 전체 방문자를 계산한 뒤, 방문자가 많은 날짜를 월별로 요약하는 코드입니다.

monthly_summary <- museum |>
  filter(휴관일 == "N") |>
  mutate(
    총방문자 = 통영_합계 + 타지역_합계,
    월 = lubridate::month(날짜)
  ) |>
  select(날짜, 월, 총방문자) |>
  arrange(desc(총방문자)) |>
  slice_head(n = 50) |>
  summarise(
    평균방문자 = mean(총방문자, na.rm = TRUE),
    최대방문자 = max(총방문자, na.rm = TRUE),
    날짜수 = n(),
    .by = 월
  )

monthly_summary

|>는 앞 단계의 결과를 다음 함수의 첫 번째 인수로 전달합니다. 기존 코드에서 자주 보이는 %>%와의 차이는 R 파이프 연산자 사용법에서 예제와 함께 확인할 수 있습니다.

빅데이터분석기사 실기에서 dplyr를 사용할 때

빅데이터분석기사 실기에서는 함수를 외우는 것보다 문제의 요구를 함수로 빠르게 바꾸는 연습이 중요합니다.

  • 조건에 맞는 행 추출: filter()
  • 분석에 필요한 변수 선택: select()
  • 파생변수 생성: mutate()
  • 상위·하위 데이터 추출: arrange(), slice_max()
  • 그룹별 통계량 계산: summarise(.by = )
  • 결측값 제외: na.rm = TRUE

시험 구성과 준비 순서는 빅데이터분석기사 완전 가이드에서 확인하세요.

dplyr 자주 묻는 질문

dplyr와 tidyverse는 같은 패키지인가요?

다릅니다. dplyr는 데이터 전처리를 담당하는 개별 패키지이고, tidyverse는 dplyr, ggplot2, tidyr, readr 등 여러 패키지를 함께 설치하고 불러오는 패키지 모음입니다.

filter()와 slice()의 차이는 무엇인가요?

filter()는 열의 값을 조건으로 행을 선택하고, slice()는 행 번호나 순위를 기준으로 선택합니다.

select()와 mutate()의 차이는 무엇인가요?

select()는 사용할 열을 고르고, mutate()는 계산을 통해 새 열을 만들거나 기존 값을 바꿉니다.

group_by()와 .by 중 무엇을 사용해야 하나요?

여러 단계에 같은 그룹을 계속 적용하려면 group_by()가 편합니다. 한 번의 summarise()나 mutate()에만 그룹이 필요하다면 .by가 간결합니다.

마치며

dplyr를 익히는 가장 빠른 방법은 같은 데이터로 여섯 함수를 반복해 보는 것입니다. 행을 고르는 slice()와 filter(), 열을 다루는 select()와 mutate(), 순서를 바꾸는 arrange(), 결과를 줄이는 summarise()의 역할부터 구분해 보세요.

R·Python·SQL을 어떤 순서로 공부할지 고민된다면 슬기로운 통계생활 프로그래밍 Track도 함께 확인해 보세요. 실행되지 않는 dplyr 코드가 있다면 사용한 데이터 구조와 오류 메시지를 댓글로 남겨주시면 확인해 드리겠습니다.


당신이 좋아할 만한 콘텐츠

by Google Adsense


관련 글 보기