Menu

R의 dplyr: filter, select, mutate, summarize — 실전 입문

dplyr이 무엇인지, 어떻게 설치하는지, 그리고 여섯 개의 핵심 동사와 파이프가 어떻게 지저분한 데이터 프레임 코드를 읽기 좋은 파이프라인으로 바꾸는지 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

dplyr이란 무엇인가

dplyr은 데이터 조작을 위한 R의 가장 인기 있는 패키지로, 몇 개의 동사로 만들어진 "데이터의 문법"입니다. 각 동사는 데이터 프레임을 받아 정확히 한 가지 일(행 일부 남기기, 열 추가하기, 그룹 요약 계산하기)을 하고 새 데이터 프레임을 돌려주는 함수입니다. 모든 동사가 데이터 프레임이 들어가고 데이터 프레임이 나오는 같은 모양이기 때문에, 파이프로 딱딱 맞물려 위에서 아래로 레시피처럼 읽히는 파이프라인이 됩니다. dplyr은 이 설계를 공유하는 패키지 가족(tidyr, ggplot2, readr)인 tidyverse의 핵심입니다.

dplyr이 하는 모든 것을 기본 R도 합니다. 아래는 순수 기본 R로 쓴 작은 분석입니다. 내장 mtcars 데이터를 4기통 자동차로 걸러 내고, 새 열을 계산하고, 기어 수별로 평균을 냅니다. 이것은 실행됩니다.

동작하고, 좋은 R 코드입니다. 다만 이야기가 대괄호 인덱싱, $ 대입, 수식에 흩어져 있다는 점을 눈여겨보세요. 같은 분석의 dplyr 버전은 이렇습니다.

library(dplyr)

mtcars |>
    filter(cyl == 4) |>
    mutate(kml = mpg * 0.425) |>
    group_by(gear) |>
    summarize(avg_kml = round(mean(kml), 1))

네 개의 동사가, 여러분이 소리 내어 설명할 법한 순서대로 놓여 있습니다. 이 가독성이 세일즈 포인트 전부이며, 20단계짜리 파이프라인에서는 결정적입니다.

이 페이지의 dplyr 코드는 이 편집기가 기본 R만 실행하기 때문에 정적입니다. 실행해 보려면 아래에서 설명하는 대로 자기 컴퓨터에 dplyr을 설치하세요.

설치하고 불러오기

한 번 설치한 뒤, 그것을 쓰는 모든 스크립트에서 불러옵니다.

install.packages("dplyr")   # once, per machine
library(dplyr)              # every script

대신 install.packages("tidyverse")를 설치하면 dplyr과 형제 패키지들이 함께 딸려 옵니다. dplyr이 로드될 때 stats::filterstats::lag를 가린다는 경고가 나오는데, 정상이며 오류가 아닙니다.

여섯 개의 핵심 동사

모든 동사는 데이터 프레임을 첫 인자로 받고, 열 이름을 따옴표나 df$ 접두사 없이 그대로 받습니다.

filter()는 조건에 맞는 행을 남깁니다.

mtcars |> filter(mpg > 25)
mtcars |> filter(cyl == 4, hp < 70)   # comma = AND

select()는 이름, 범위, 도우미 함수로 열을 남깁니다.

mtcars |> select(mpg, cyl, hp)
mtcars |> select(mpg:hp)              # a range of adjacent columns
mtcars |> select(starts_with("d"))    # disp, drat

mutate()는 열을 추가하거나 변환합니다.

mtcars |> mutate(kml = mpg * 0.425, heavy = wt > 3.5)

arrange()는 행을 정렬합니다. 내림차순으로 하려면 열을 desc()로 감싸세요.

mtcars |> arrange(desc(mpg))

summarize()는 행들을 하나의 요약 행으로 접고, **group_by()**는 그것을 그룹별로 접게 만듭니다.

mtcars |>
    group_by(cyl) |>
    summarize(n = n(), avg_mpg = mean(mpg))

group_by()는 그 자체로는 눈에 보이는 일을 하지 않습니다. 데이터 프레임에 표시를 달아 두어 다음에 오는 summarize()(또는 mutate())가 그룹 단위로 동작하게 할 뿐이죠. 각 동사에는 이 장에 별도의 문서가 있습니다. 행 필터링, 열 추가, 정렬, 그룹 요약을 참고하세요.

파이프로 동사 잇기

파이프 |>는 앞의 값을 받아 뒤에 오는 함수의 첫 인자로 넣습니다. x |> f(y)f(x, y)를 뜻하죠. 모든 dplyr 동사가 데이터 프레임을 받아 데이터 프레임을 돌려주므로 동사는 끝없이 이어집니다.

mtcars |>
    filter(hp > 100) |>
    mutate(kml = mpg * 0.425) |>
    group_by(cyl) |>
    summarize(cars = n(), avg_kml = round(mean(kml), 1)) |>
    arrange(desc(avg_kml))

소리 내어 읽어 보세요. mtcars를 가져와서, 마력이 100을 넘는 차만 남기고, 리터당 킬로미터 열을 더하고, 기통 수로 묶고, 각 그룹의 개수와 평균을 내고, 평균으로 정렬합니다. 중간 변수도, 중첩도 없습니다. 오래된 코드는 |> 대신 magrittr 패키지의 %>%를 씁니다. dplyr 작업에서는 서로 바꿔 쓸 수 있으며, R 4.1 이상에 내장된 |>파이프 문서에서 다룹니다.

count()와 n(): 세기 도우미

세는 일이 너무 흔해서 dplyr에는 지름길이 있습니다. n()은 현재 그룹의 행 개수를 주고(summarize()mutate() 안에서만 유효합니다), count()group_by() + summarize(n = n())이라는 춤 전체를 한 번의 호출로 줄여 줍니다.

mtcars |> count(cyl)                    # rows per cyl value
mtcars |> count(cyl, gear, sort = TRUE) # two groupers, biggest first

group_by(x) |> summarize(n = n())을 쓰고 있다면 count(x)로 바꾸세요.

tibble에 대한 한마디

dplyr 동사는 종종 tibble, 즉 tidyverse가 변형한 데이터 프레임을 돌려줍니다. 그것은 데이터 프레임입니다(데이터 프레임을 받는 모든 것이 tibble도 받습니다). 다만 출력이 더 친절합니다. 처음 10행만, 화면에 들어가는 열만, 각 이름 아래 타입을 함께 보여 줍니다. 알아 둘 차이가 둘 있습니다. tibble은 행 이름을 결코 쓰지 않으며(그래서 mtcars |> as_tibble()은 차 이름을 잃습니다. tidyverse는 식별자가 실제 열에 있기를 기대합니다), 대괄호 하나 인덱싱은 때때로 벡터로 떨어지는 대신 언제나 tibble을 돌려줍니다. 어느 쪽도 일상에서 놀랄 일은 아닙니다. str()tbl_df라고 말해도 당황하지 마세요.

핵심 정리

  • dplyr은 문법입니다. 여섯 개의 동사가 각각 데이터 프레임에 한 가지 일을 하고 파이프로 이어집니다.
  • filter()는 행을, select()는 열을 고르고, mutate()는 열을 추가하며, arrange()는 정렬하고, group_by() + summarize()는 집계합니다.
  • x |> f(y)f(x, y)입니다. 파이프라인은 일이 일어나는 순서대로 위에서 아래로 읽힙니다.
  • count()n()이 세는 일의 대부분을 처리합니다.
  • 기본 R로도 전부 할 수 있습니다. 파이프라인이 길어지면 dplyr이 가독성에서 이깁니다.

다음 순서는 필터링과 부분 선택을 깊이 다루는 것입니다. 기본 R의 대괄호 관용구와 dplyr의 filter()가 어디에 자리 잡는지 살펴봅니다.

자주 묻는 질문

R에서 dplyr이란 무엇인가요?

dplyr은 데이터 프레임을 조작하는 데 가장 널리 쓰이는 R 패키지입니다. filter(), select(), mutate(), arrange(), summarize(), group_by()라는 작은 동사 집합을 제공하며, 각 동사가 데이터 프레임에 한 가지 일만 하고 파이프로 이어져 읽기 좋은 파이프라인이 됩니다. tidyverse의 일부입니다.

dplyr은 어떻게 설치하나요?

install.packages("dplyr")을 한 번 실행한 뒤, 그것을 쓰는 모든 스크립트 맨 위에 library(dplyr)을 두세요. 대신 tidyverse를 설치하면 dplyr과 형제 패키지들(tidyr, ggplot2, readr)을 한 번에 얻습니다.

dplyr이 꼭 필요한가요, 기본 R로 충분한가요?

기본 R로도 dplyr이 하는 모든 일(부분 선택, aggregate(), order())을 할 수 있고, 의존성 없이 어디서나 동작하므로 알아 둘 가치가 있습니다. dplyr은 파이프라인이 길어질 때 설치할 값어치를 합니다. 다섯 개의 동사를 이으면 문장처럼 읽히는 반면, 기본 R 버전은 중첩된 대괄호 퍼즐처럼 읽힙니다.

dplyr에서 summarize와 summarise의 차이는 무엇인가요?

없습니다. 미국식과 영국식 철자만 다른 같은 함수이며 dplyr이 둘 다 내보냅니다. 팀에서 쓰는 쪽을 골라 일관되게 쓰세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기