데이터를 불러온 다음에는 가장 기본적인 작업으로 원하는 데이터를 추출하거나 정리하는 과정이 필요하다. 원하는 열만 골라내고, 조건에 맞는 행만 선택하며, 새로운 변수를 계산하거나, 그룹별로 요약 통계를 내는 작업은 대부분의 분석에서 반드시 거쳐야 하는 단계이다.
이러한 작업을 더 쉽고 간결하게 만들어주는 도구가 바로 dplyr 패키지이다. dplyr은 R에서 데이터프레임을 조작할 때 사용되는 대표적인 패키지로, 직관적인 함수 이름과 간결한 문법 덕분에 초보자도 쉽게 배울 수 있다.
dplyr의 핵심 기능인 select( ), filter( ), mutate( ), arrange( ), group_by( ) 및 summarise( ) 함수를 하나씩 예제와 함께 소개한다. 예제 데이터로는 dplyr에 내장된 starwars 데이터셋을 활용한다.
예제 데이터 소개: starwars
starwars는 스타워즈 시리즈에 등장하는 캐릭터들의 정보를 담은 데이터셋으로, dplyr 패키지에 기본으로 포함되어 있다. 이 데이터셋은 다양한 변수 유형(문자, 숫자, 리스트 등)과 결측값이 혼합되어 있어 실제 분석 연습에 적합하다. 총 87개의 행으로 구성되어 있으며, 주요 변수는 다음과 같다.
변수명 | 설명 |
---|---|
name | 캐릭터 이름 |
height | 키 (cm 단위) |
mass | 몸무게 (kg 단위) |
species | 종족 (예: Human, Droid 등) |
homeworld | 고향 행성 이름 |
sex | 생물학적 성별 |
birth_year | 출생 연도 (BBY 기준) |
다양한 전처리 상황을 연습할 수 있다는 점에서 매우 유용한 예제이다. 먼저 데이터 구조를 확인해보자.
library(dplyr)
glimpse(starwars)
R열 선택: select( )
특정 열만 추출하고 싶을 때 사용하는 함수가 select( )이다. 예를 들어 이름, 종족, 고향 행성만 선택하고 싶다면 다음과 같이 작성할 수 있다.
starwars %>%
select(name, species, homeworld)
Rselect( )는 분석에 필요한 열만 추출하여 코드의 가독성을 높이고, 불필요한 열을 제거함으로써 처리 속도도 향상시킨다.
조건에 따라 행 선택: filter()
filter( )는 특정 조건을 만족하는 행만 남긴다. 예를 들어, 종족이 “Human”인 캐릭터만 추출하고 싶다면 아래와 같이 작성한다.
starwars %>%
filter(species == "Human")
Rselect( )는 분석에 필요한 열만 추출하여 코드의 가독성을 높이고, 불필요한 열을 제거함으로써 처리 속도도 향상시킨다.
조건에 따라 행 선택: filter( )
filter( )는 특정 조건을 만족하는 행만 남긴다. 예를 들어 종족이 “Human”인 캐릭터만 추출하고 싶다면 아래와 같이 작성한다.
starwars %>%
filter(species == "Human")
R조건식에는 ==, !=, >, <, %in% 등의 연산자를 사용할 수 있다. 예를 들어 성별이 “male” 또는 “female”인 캐릭터만 추출하고 싶다면 다음과 같다.
starwars %>%
filter(sex %in% c("male", "female"))
R새로운 변수 만들기: mutate( )
mutate()는 기존 데이터를 기반으로 계산한 새로운 변수를 추가하는 데 사용된다. 예를 들어 캐릭터의 키와 몸무게를 바탕으로 체질량지수(BMI)를 계산할 수 있다.
starwars %>%
mutate(bmi = mass / ((height / 100) ^ 2)) %>%
select(name, mass, height, bmi)
R새로운 열은 데이터프레임의 마지막 열로 추가되며, 기존 변수들과 함께 활용할 수 있다.
정렬: arrange( )
arrange( ) 함수는 데이터를 원하는 열 기준으로 정렬한다. 예를 들어 키가 큰 순서대로 정렬하고 싶다면 다음과 같이 작성한다.
starwars %>%
arrange(desc(height)) %>%
select(name, height)
R여러 기준으로 정렬하고 싶을 때는 쉼표로 나열하면 된다. 예를 들어 종족별로 오름차순 정렬 후, 키는 내림차순 정렬하려면 다음과 같다.
starwars %>%
arrange(species, desc(height))
R그룹별 요약: group_by() + summarise( )
그룹별로 요약 통계를 계산하려면 먼저 group_by( )로 그룹을 설정하고, summarise( )로 집계를 수행한다. 예를 들어 종족별 평균 키를 계산하려면 다음과 같이 작성한다.
starwars %>%
filter(!is.na(height)) %>%
group_by(species) %>%
summarise(
avg_height = mean(height),
count = n()
)
R여기서 mean(height)는 평균 키, n( )은 각 종족의 캐릭터 수를 나타낸다. 결측값이 있는 경우 정확한 계산을 위해 filter(!is.na( ))를 먼저 사용하는 것이 좋다.
예시 출력 결과
# A tibble: 5 × 3
name height mass
<chr> <int> <dbl>
1 Chewbacca 228 112
2 Darth Vader 202 136
3 Qui-Gon Jinn 193 89
4 Obi-Wan Kenobi 182 77
5 Luke Skywalker 172 77
R요약 정리
함수 | 역할 설명 |
---|---|
select( ) | 원하는 열만 선택 |
filter( ) | 조건에 맞는 행 추출 |
mutate( ) | 새로운 열(계산 변수) 생성 |
arrange( ) | 데이터를 정렬 (오름차순/내림차순) |
group_by( ) | 그룹 설정 (요약 통계 계산 전 그룹 기준 설정) |
summarise( ) | 그룹별 요약 지표 계산 (예: 평균, 합계, 개수 등) |
마무리하며
dplyr은 데이터 전처리를 손쉽고 명확하게 만들어주는 매우 유용한 도구이다. 여섯 가지 핵심 함수(select, filter, mutate, arrange, group_by, summarise)는 실제 분석 작업의 대부분을 커버할 수 있을 정도로 강력하다. 데이터를 자유롭게 다룰 수 있어야만 본격적인 시각화와 모델링이 가능하다.
1. dplyr 함수는 원본 데이터를 수정하지 않으므로 결과를 저장하려면 <- 연산자로 새로운 객체에 할당해야 한다.
2. filter( )나 mutate( )를 사용할 때는 결측값(NA) 처리를 명시적으로 해주는 것이 오류를 줄이는 데 도움이 된다.
3. 파이프 연산자 %>%를 사용하면 분석 흐름을 위에서 아래로 순차적으로 읽을 수 있어 가독성이 좋아진다.
4. summarise( )는 항상 group_by( ) 이후에 사용하며, 여러 요약 지표를 동시에 계산할 수 있다.