R에서 Pipe 연산으로 분석하기

magrittr 패키지가 최근에 많은 화제를 불러 일으키고 있다. 사실 이 패키지는 패키지 자체로 유명세를 탔다고 하기 보다는 다른 유명 패키지가 이 패키지를 사용하게 됨으로써 유명세를 탓고 필자도 현재 이 패키지 때문에 dplyr과 같은 패키지를 자연스럽게 사용하게 되었다.

이 패키지는 유닉스에 있는 파이프(|, >) 연산자와 같은 기능을 아래와 같이 R에서 쓸 수 있게 해주는 연산자이다.

library(magrittr)
library(dplyr)
library(lubridate)

#head(iris)
iris %>% head  
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
#iris 데이터에 대해서 group by연산을 수행하고 이 결과를 기반으로 Sepal.Length의 평균과 Petal.Length의 평균을 구한다. 
iris %>% group_by(Species) %>% 
  summarise(mofSL=mean(Sepal.Length), mofPL=mean(Petal.Length)) 
## Source: local data frame [3 x 3]
## 
##      Species mofSL mofPL
## 1     setosa 5.006 1.462
## 2 versicolor 5.936 4.260
## 3  virginica 6.588 5.552
#iris 데이터에서 Species 필드를 제외한 필드들 각각의 max, min 값을 구한다. 
iris %>% select(-Species) %>% 
  apply(2, lambda( x ~ c(max(x), min(x))))
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]          7.9         4.4          6.9         2.5
## [2,]          4.3         2.0          1.0         0.1
#특정 기간의 날짜에서 일요일만 제거한 날짜의 첫 부분을 출력한다. 
seq(ymd("2014-01-01"), ymd('2014-08-01'), by="1 day")  %>% 
  Filter(lambda(x ~  (x %>% weekdays) != "Sunday"),.) %>% head %>% print
## [1] "2014-01-01 UTC" "2014-01-02 UTC" "2014-01-03 UTC" "2014-01-04 UTC"
## [5] "2014-01-06 UTC" "2014-01-07 UTC"

그런데 단순한 Syntactic Sugar의 역할을 할것만 같았던 이 패키지가 필자의 마음을 흔들어 놓았는지 설명할 필요가 있을 것이다.

위 방식의 장점은 아래와 같다.

  • 코드의 복잡도가 늘어가면 유지 보수나 추후 코드 리딩에 문제가 생길 수 있어 적절한 중간 변수를 만들어두는데 위와 같은 방식은 코드의 복잡도가 리딩에 끼치는 악영향이 기존보다 획기적으로 줄어들기 때문에 빈번한 중간 변수 할당에 따른 메모리 소모를 줄일 수 있다.
  • 코드 작성 방향과 데이터 흐름의 방향 및 생각의 방향이 일치화 되어 코드를 이해하기 쉽다.
  • 결국 dplyr을 쓰게되는데, 이덕분에 data.table문법을 따로 배울 필요가 없어지는데 이는 dplyr에서 알아서 처리해 주기 때문이다.

단점은 아래와 같다.

  • 내가 아닌 이 방식을 이해하지 못하는 다른 사람들이 이 코드를 보게 된다면 당황해 할 수 있다.
  • 위 방식만 고수하기 보다는 기존 방식과 위 방식을 겸용하게 됨으로써 자칫 스파게티 코드가 될 위험이 있다.
  • 결국 dplyr을 쓰게 된다. 나는 data.table 사용자인데 말이다(물론 dplyr는 잘 지원해준다).

앞으로 magrittr 패키지는 폭넓게 사용될 것으로 예상이 되는데 이는 인기 패키지인 dplyr과 앞으로 많은 각광을 받게될 ggvis가 이 방식을 사용하면서 많은 사용자 경험을 이끌 것이기 때문이다. 장점이 있는 패키지임에는 분명하기 때문에 사용자는 점점 많아질 것이다.

CC BY-NC 4.0 R에서 Pipe 연산으로 분석하기 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.