본문 바로가기
R

R - 데이터 분석 (1) : Magrittr 과 파이프 오퍼레이터

by Tiabet 2023. 5. 6.

최근에 R로 데이터를 분석하고 시각화하는 것을 배우고 있는데, 양이 많아서 차근차근 정리해보고자 한다.

 

R의 최대 장점이라면 파이썬처럼 오픈라이브러리 방식이라는 점일 것이다. 다른 사람들이 만들어놓은 유용한 패키지들을 가져다가 적절하게 사용할 수 있다는 것이다. 파이썬과 R 의 대표적인 패키지들은 깊게는 알지 못하지만, 수박겉핥기 식으로 사용해봤을 때 R 의 패키지들이 더욱 다양한 기능들을 제공해주는 느낌이 들었다. 특히 Tidyverse라고 하여 주요 패키지에서 끊임없이 확장, 추가 생성되는 일종의 유니버스까지 존재했다.

 

이번 포스팅에선 대표적인 패키지 중 하나인 Magrittr과 그 기능인 파이프 오퍼레이터에 대해서 정리하려고 한다.

 

파이프 오퍼레이터와 Magrittr

Magrittr 패키지는 코드를 파이프라인 스타일로 설계하는 것을 가능하게 해준다. 주요 함수는 '%>%' 인데, 이를 파이프 오퍼레이터라고 부른다. 말로 설명해봤자 감이 잘 안잡히므로 ChatGPT로부터 얻은 예시 하나를 짚고 넘어가겠다.

 

df <- data.frame(
  name = c("Alice", "Bob", "Charlie", "David"),
  age = c(19, 20, 18, 19),
  grade = c(85, 90, 75, 80)
)

위와 같은 데이터프레임을 갖고 있을 때, 다음 세 작업을 실행하고 싶다.

 

1. 연령이 19세 이상인 행만 선택한다.
2. 선택한 행의 평균 성적을 산출한다.
3. 평균 성적을 소수점 이하 두 자리로 반올림한다.

 

만약 이를 파이프 오퍼레이터를 사용하지 않고 구현한다면 아래와 같다.

df_filtered <- subset(df, age >= 19)
mean_grade <- mean(df_filtered$grade)
mean_grade_rounded <- round(mean_grade, 2)
mean_grade_rounded

코딩의 특성상 새로운 변수를 선언해주고 그 변수에 값을 저장해주어야 하기 때문에, 코드가 장황해지는 것을 확인할 수 있다. 꼭 새로운 변수를 선언하지 않는다 하더라도 괄호를 겹겹이 사용하여 함수 안에 함수를 집어넣는 형식으로 구현해야 하는데, 그 또한 가독성이 떨어지긴 마찬가지일 것이다. 이제 파이프 오퍼레이터를 사용하고 구현해보자.

library(magrittr)
library(dplyr)

df %>%
  filter(age >= 19) %>%
  summarize(mean_grade = mean(grade)) %>%
  round(2)

파이프 오퍼레이터를 사용하면 변수를 새로 선언하고 저장할 필요 없이 연속적으로 작업을 실행하는 것이 가능하다.  훨씬 가독성도 좋고, 직접 코딩을 해보면 이런 방식이 훨씬 편한 것을 느낄 수 있다.

 

위 코드를 조금만 더 자세히 살펴보면,

1. 우선 df에서 작업할 것이기 때문에 df를 써주고 파이프 오퍼레이터 >%> 를 사용하여 다음 작업으로 넘긴다.

2. filter 함수를 사용하여 조건에 맞는 행을 선택해준다. (filter 함수는 dplyr 패키지에 있는 함수다.)

3. summarize 함수를 사용하여 mean_grade에 평균을 저장해준다. (꼭 사용해줘야 한다.)

4. round 함수를 소수 둘째 자리에서 반올림 해준다.

 

하고 싶은 작업들을 순차적으로 실행하기 때문에, 코딩하기도 쉽고 읽는 사람도 쉬워지는 것을 볼 수 있다.